kmjp's blog

競技プログラミング参加記です

Codeforces #173 Div2. A. Bit++, B. Painting Eggs

Div2なので不参加だけど練習。
http://codeforces.com/contest/282/problem/A
http://codeforces.com/contest/282/problem/B

A. Bit++

変数Xに対して前置・後置でインクリメント・デクリメント要求が行われるので、変数Xの最終的な値を答える。

要求の種類は4種類だけなので、それぞれに応じてXをinc/decしていけばよい。

void solve() {
	int f,r,i,j,k,l, x,y,ma,num,nt;
	char s[100];
	
	j=GETi();
	k=0;
	FOR(i,j) {
		GETs(s);
		if(strcmp("X++",s)==0) k++;
		if(strcmp("++X",s)==0) k++;
		if(strcmp("X--",s)==0) k--;
		if(strcmp("--X",s)==0) k--;
	}
	
	_P("%d\n",k);
	return;
}

B. Painting Eggs

N種類の卵がある。各卵に色を塗りたいが、GとAの両者に頼む際両者の値段は異なる。
しかし両者の値段の和は常に1000である。
卵を順々に色づけする際、GとAのかかる金額の差額が500以内になるようにする場合、両者への以来方法を答える。

途中まで処理した時点で両者の金額の差が500以内の場合、次の卵をAとGのいずれかに頼むと、その結果も金額の差を500以内に抑えることができる。
よって、常に金額の差が小さくなる方を選択すればよい。

void solve() {
	int f,r,i,j,k,l, x,y,ma,num,nt;
	int N,d;
	
	N=GETi();
	d=0;
	FOR(i,N) {
		GET2(&x,&y);
		if(abs(d+x)<=abs(d-y)) {
			_P("A");
			d+=x;
		}
		else {
			_P("G");
			d-=y;
		}
	}
	
	_P("\n");
	return;
}

まとめ

Bは問題自体は良いけど、問題文と設定が不自然すぎていまいちだな…。
おかげで意図がつかみにくかった。
もう少し自然なストーリーだといいのにな。