1. 程式人生 > 其它 >CF1433B Yet Another Bookshelf 題解

CF1433B Yet Another Bookshelf 題解

CF1433B Yet Another Bookshelf 題解

Content

在一個僅有 \(0,1\) 這兩個數的數列上,每次可以選擇一段全為1的連續區間將其左移 \(1\) 或者右移 \(1\)。現給出 \(t\) 次詢問,每次詢問給出一個長度為 \(n\) 的滿足上述條件的數列,求出使所有為 \(1\) 的位置在唯一一個連續區間的最小操作次數。

資料範圍:\(1\leqslant t\leqslant 200,1\leqslant n\leqslant 50\)

Solution

每次我們選擇全為 \(1\) 的區間向右移,其實就是為了把目標區間中的 \(0\) 給它補齊,所以,我們不難看出,這題目就是讓我們求每兩個 \(1\) 之間的 \(0\) 的數量的總和。直接掃一遍統計一下即可。

Code

int t, n, a[57];

int main() {
	//This program is written in Windows 10 by Eason_AC
	getint(t);
	while(t--) {
		int ans = 0, tmp = 0, flag = 0;
		getint(n);
		_for(i, 1, n) {
			getint(a[i]);
			if(a[i] == 0 && flag) {
				tmp++;
				if(i == n)	tmp = 0;
			} else if(a[i] == 1) ans += tmp, tmp = 0, flag = 1;
		}
		writeint(ans), puts("");
	}
	return 0;
}