そこまで悪くはない結果。
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; } } }
まとめ
変なミスしてるのもったいないな…。