kmjp's blog

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

AtCoder ARC #211 : A - Banned X 2

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;
	}
}

まとめ

まぁこれはすんなり。