贪心题。
每种颜色至少可以被使用minn次,这是显而易见的。
我们要想尽可能多的为正方形上色其实也就是想尽可能多的使用那些颜料多于minn公升的颜色,不难发现我们应该寻找两个min值的最长区间(把整个区间看整一个环形)(把整个区间看整一个环形)(把整个区间看整一个环形)。
可以转化为求两个最小值之间的最大距离,手推几组数据可以发现这几组数据都是从最小值之间的最大长度开始算起的。
然后,最小值 * n+最小值之间的最大长度=能够用掉的最多油漆。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=2e5+5;
int main()
{
int a[N],n,minn=1e9;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
minn=min(a[i],minn);//找到最小数
}
int len=0,ppre;
int pre=0;//标记
for(int i=1;i<=n;i++)
{
if(a[i]==minn)
{
if(pre==0)
{
pre=ppre=i;//把出现的第一个最小数的 下标找出来
}
else
{
len=max(len,i-(ppre+1));//找出相近的两个最小数之间的存在的数据个数
ppre=i;//第一次出现的最小值之后 再出现的 最小值的下标
}
}
}
len=max(n-(ppre-pre+1),len);//第一个最小值与最后一个最小值之间的长度与上面的len找最大距离(把整个数据看成环形)
cout<<(long long)minn*n+len<<endl;
return 0;
}