kmjp's blog

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

Codeforces #258 Div2 C. Predict Outcome of the Game

Codeforces#258に参加。
Eが解けないのは自分の実力不足だけど、Bをミスしたのは痛かった。
http://codeforces.com/contest/451/problem/C

問題

3つのチームがあり、1回の試合でうち2チームが対戦してどちらかが勝つ。
最初のK試合の結果、チーム1とチーム2の勝利回数の差の絶対値はD1、チーム2とチーム3の勝利回数の差の絶対値はD2であった。
残りの(N-K)試合を行った結果、全チームの勝利回数が等しくなることはあるか。

解法

3チームが最終的にN/3試合ずつ勝てるか判定したい。
K試合後の3チームの勝利回数をa,b,cと置く。a,b,cには以下の関係がある。

  • a+b+c = K
  • a >= b ならa-b = D1、a
  • c >= b ならc-b = D2、c

よって以下の4つの方程式のうち、1つでも満たせるか判定すればよい。

  • a+b+c=K, a-b=D1, c-b=D2 (a>=b, c>=b, 0<=a<=N/3, 0<=b<=N/3, 0<=c<=N/3)
  • a+b+c=K, a-b=D1, b-c=D2 (a>=b, b>=c, 0<=a<=N/3, 0<=b<=N/3, 0<=c<=N/3)
  • a+b+c=K, b-a=D1, c-b=D2 (b>=a, c>=b, 0<=a<=N/3, 0<=b<=N/3, 0<=c<=N/3)
  • a+b+c=K, b-a=D1, b-c=D2 (b>=a, b>=c, 0<=a<=N/3, 0<=b<=N/3, 0<=c<=N/3)
int T;
ll N,K,D1,D2;

void solve() {
	int f,i,j,k,l,x,y;
	
	cin>>T;
	FOR(i,T) {
		cin>>N>>K>>D1>>D2;
		int ok=0;
		FOR(j,4) {
			x=(j%2)?1:-1;
			y=(j/2)?1:-1;
			
			ll t=K+x*D1+y*D2;
			ll b=t/3;
			ll a=b-x*D1;
			ll c=b-y*D2;
			if(t%3==0 && a<=N/3 && a>=0 && b<=N/3 && b>=0 && c<=N/3 && c>=0) ok++;
		}
		if(N%3==0 && ok) _P("yes\n");
		else _P("no\n");
	}
}

まとめ

問題としては面白いけど、問題設定はちょっと不自然かも。