問題はこちら
No.501 穴と文字列 - yukicoder
できるだけ多くAを使えば良い
また穴が2個,0個の文字が必要なときは、それぞれB,Cを使えば良い(辞書順最小なので)。
・D≧Nのとき
Aだけでは穴が足りないので末尾にBを増やす必要がある。
Aを1つBに取り替える毎に穴は1つ増えるので、Aを2*N-D個、BをD-N個にすればよい
・D≦Nのとき
Aだけでは穴が多いので末尾にCを増やす必要がある。
Aを1つCに取り替える毎に穴は1つ減るので、AをD個、CをN-D個にすればよい
i,n,d; main(){ scanf("%d%d",&n,&d); if(d>n){ for(i=0;i<n+n-d;i++)putchar('A'); for(;i<n;i++)putchar('B'); }else{ for(i=0;i<d;i++)putchar('A'); for(;i<n;i++)putchar('C'); } }
ぐっと睨むと、Aの個数がmin(D,2*N-D)であることがわかるので、分岐をまとめることができ
#define min(p,q)(p<q?p:q) i,n,d; main(){ scanf("%d%d",&n,&d); for(i=0;i<min(d,2*n-d);i++)putchar('A'); for(;i<n;i++)putchar(d>n?'B':'C'); }
さらに2つのfor文もまとめて
#define min(p,q)(p<q?p:q) i,n,d; main(){ scanf("%d%d",&n,&d); for(i=0;i<n;i++)putchar(i<min(d,2*n-d)?'A':d>n?'B':'C'); }
分岐を逆にするなど適当に縮めて
i;main(n,c){for(scanf("%d%d",&n,&c);i++<n;putchar(i>c|i>n+n-c?66|c<n:65));}
75B