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"); } }
まとめ
問題としては面白いけど、問題設定はちょっと不自然かも。