読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.436 ccw

問題はこちら
No.436 ccw - yukicoder

やるだけ
cが2個以上かつwが1個以上あることがccwが存在するための必要十分条件なので、cを1個以下にするかwをすべて消すか。
つまり「cの個数-1」「wの個数」のminが答え

#define min(p,q)(p<q?p:q)
char s[10010];
int c,w,i;
int main(){
	gets(s);
	for(i=0;s[i];i++)if(s[i]=='c')c++;else w++;
	printf("%d",min(c-1,w));
	return 0;
}

当然配列に読み込む必要はないのでgetcharで頑張る
'c'が99、'w'が119、'\n'が10なので、いい感じに分離出来る方法を考えると

i,j;
main(x){
	for(;x=~getchar();x%3?i++:j++);
	i=!printf("%d",i-2<j?i-2:j);
	//改行の分でiが余分に増えるので-1でなく-2
}

ここでiをmain引数にして、更に正負を逆にすれば、~iで求める値が取り出せる

x,j;
main(i){
	for(;x=~getchar();x%3?i--:j++);
	x=!printf("%d",~i<j?~i:j);
}

最後に出力もfor文のなかに押し込んで

x,j;main(i){for(;x=~getchar()?:!printf("%d",~i<j?~i:j);x%3?i--:j++);}

69B