メモ

yukicoderでゆるふわgolf

No.501 穴と文字列 - yukicoder

問題はこちら
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