kmjp's blog

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

AtCoder ARC #198 : B - Rivalry

そこまで悪くはない結果。
https://atcoder.jp/contests/arc198/tasks/arc198_b

問題

X個の0、Y個の1、Z個の1を円周状に並べたい。
その時、整数Wの両隣のうち、W未満の値がW個あるようにしたい。
条件を満たす並べ方は可能か判定せよ。

解法

  • 2の隣は、0か1
  • 1の隣は、0が1個
  • 0の隣は、なんでもよい

とすると、0と0の間にあり得るのは以下の配置。

  • 00
  • 020
  • 0120
  • 0210
  • 01210
  • 0110

よってまず0の間に2を置こう。
そして2の両隣に、極力1を置く。
残された1は、2個ずつ0の間に入れる。よって、1が奇数個なら、2の両隣に置いた1を1個回収する。

この時、2の数と、2個ずつ入れた1の対の数がX以下なら、条件を満たす置き方ができる。

int T;
int X,Y,Z;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	while(T--) {
		cin>>X>>Y>>Z;
		Y=max(0,Y-2*Z);
		
		if(Y%2&&Z) Y++;
		
		if(Y%2) {
			cout<<"No"<<endl;
		}
		else if(Y/2+Z>X) {
			cout<<"No"<<endl;
		}
		else {
			cout<<"Yes"<<endl;
		}
	}
}

まとめ

変なミスしてるのもったいないな…。