移动序列
AcWing 3686
https://www.acwing.com/problem/content/3689/
贪心
思路
如图:四段连续的1,中间隔3个0.
从最左段开始,如果向左移,则中间隔4个0.如果向右移,两段连续1合并成一段,中间隔2个0.
如果从中间段开始,左移或右移,中间隔着的0个数不变。
所以我们只要找从第一个1到最后一个1中间隔多少个0.
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 55;
int T,n;
int a[N];
int main()
{
cin >> T;
while (T--)
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
int l = 0 ,r = 0;
for (int i = 1; i <= n; i ++ )
if (a[i] == 1)
{
l = i; break;
}
for (int i = n; i >= 1; i -- )
if (a[i] == 1)
{
r = i;break;
}
//cout << l << r << endl;
int res = 0;
for (int i = l; i <= r; i ++ )
{
if (a[i] == 0) res ++;
}
cout << res << endl;
}
return 0;
}