Codeforces 610B

610B - Vika and Squares

思路:注意对环状结构的理解。找到所有值的最小值minn,然后所有值减去这个最小值,再在环状结构里找一个最长连续正数的长度maxl,答案就是minn*n+maxl。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
const int N=2e5+5;
const int INF=0x3f3f3f3f;
int a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    int minn=INF;
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>a[i],minn=min(a[i],minn);
    ll ans=(ll)minn*n;
    for(int i=0;i<n;i++)a[i]-=minn;
    int maxl=0;
    bool f=false;
    for(int i=0;i<n;i++)
    {
        if(f)break;
        if(a[i])
        {
            int cnt=0;
            for(int j=i;;j++)
            {
                if(j==n)j=0,f=true;//标记一下,不然就在环上死循环了 
                if(a[j])cnt++;
                else 
                {
                    i=j;
                    break;
                }
            }
            maxl=max(cnt,maxl);
        }
    }
    cout<<ans+maxl<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/widsom/p/7326487.html