当前位置: 代码迷 >> 综合 >> codeforces B. Maximal Continuous Rest
  详细解决方案

codeforces B. Maximal Continuous Rest

热度:42   发布时间:2023-11-19 23:32:13.0

题目链接:http://codeforces.com/contest/1141/problem/B
题目大意:给你一个数组,0代表工作,1代表休息。问能够连续休息的最长时间。也就是求连续最多的一。
题解思路:求最多的连续1,但是由第一个样例可以知道这个1可以回头,也就是成圈的。由于题目规定数组中至少有一个0所以不可能无限休息,最多两圈就必须工作。所以可以遍历两圈得到最大值。另外一种思路就是:我算出一开始连续最多的1的个数,以及最后连续最多的1的个数。这就是最小值了,然后在遍历一次比较一下,就可以得到最大值。
我们可以两头遍历,记录各自第一次碰到0的位置,然后再次遍历的时候只需要遍历这中间的就可以了。因此总共遍历一个数组的长度,复杂度就是O(n)
代码:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;int main(){ios::sync_with_stdio(false);int n, arr[200005];cin>>n;for(int i=0;i<n;i++)cin>>arr[i];int i = 0, j = n-1;int a = 0, b = 0;while(arr[i] != 0)i++, a++;while(arr[j] != 0)j--, b++;int cur = 0, ans = a+b;while(i <= j){if(arr[i] != 0)cur++;else {ans = max(ans,cur); cur = 0;}i++;}cout<<ans<<endl;
}