移动序列

移动序列

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

移动序列

上一篇:邻接表


下一篇:ApplicationContextAwareProcessor