kmjp's blog

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

Nebius Welcome Round : D. Accommodation

Dで謎ハマリしてえらいことに…。
https://codeforces.com/contest/1804/problem/D

問題

N階建ての建物があり、各フロアは窓M個分の広さがある。
各窓が明るいかどうかが与えられている。

各フロアに、窓1個分の部屋M/2個と、窓2個分の部屋M/4個を作りたい。
部屋内のうち少なくとも1個の窓が明るければ、その部屋は明るいといえる。

条件内で部屋のレイアウトを決められるとき、明るい部屋の最小値と最大値を求めよ。

解法

フロア毎に考える。
明るい部屋を最小化するには、2つ連続明るい窓を優先的に1つの部屋にしていけばよい。
逆に明るい部屋を最大化するには、2つ連続暗い窓を優先的に1つの部屋にしていけばよい。

int H,W;
string S;
int mi,ma;


void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>H>>W;
	int a1=0,a2=0;
	FOR(y,H) {
		cin>>S;
		FORR(c,S) if(c=='1') a1++,a2++;
		a2-=W/4;
		for(i=0,x=W/4;i<W-1&&x;i++) if(S[i]=='1'&&S[i+1]=='1') a1--,x--,i++;
		for(i=0,x=W/4;i<W-1&&x;i++) if(!(S[i]=='1'&&S[i+1]=='1')) a2++,x--,i++;
		
	}
	cout<<a1<<" "<<a2<<endl;
	
}

まとめ

なんか変に考えすぎてしまった。