Cで手間取ってグダグダに。
https://atcoder.jp/contests/arc211/tasks/arc211_a
問題
整数列Aが与えられる。
以下の整数列Sを考える。
- iはA[i]回登場する
- 隣接する要素の和は10にならない。
条件を満たすSが存在するには、Aを一部インクリメントしないといけない可能性がある。
その時その回数を答えよ。
解法
- Sに5がない場合
- Sに1種類または3種類の整数を配置できるなら、隣接和が10にならないようにできる。
- Sが2種類の整数しか配置できる、またその2種類の和が10なら、1か所はどうしても隣接和が10になってしまうので、間に違う値を挟む必要がある。
- Sに5がある場合
- 5の個数が過半数でない場合、5の間に他の整数を挟むことを解を0にできる
- 5の個数が過半数の場合、5の間に他の整数を挟んで、5同士が隣接しないように使用。
int T; ll A[10]; void solve() { int i,j,k,l,r,x,y; string s; cin>>T; while(T--) { ll S=0; FOR(i,9) { cin>>A[i+1]; S+=A[i+1]; } ll ma=0; for(i=1;i<=4;i++) { if(A[i]+A[10-i]==S&&A[i]&&A[10-i]) ma=1; } ll a=A[5]; ll b=S-A[5]; ma=max(ma,a-b-1); cout<<ma<<endl; } }
まとめ
まぁこれはすんなり。