题意:给定n个数,任意选定一个数以顺时针方向行进,一个数经过一次减一,遇到0停止。求最长路径。
解题思路:用长度为2n的数组储存n个数组成的圈,最长路径即为大于最小值的最长数字串加上最小值*n;
参考代码 by 不会翻车的张司机
#include<stdio.h>
#include<algorithm>
#define MAX 400000+100
int a[MAX];
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
}
int mina = *std::min_element(a+1,a+1+n);
int pos = -1;
int mlen= 0;
/* 求大于最小值的最长字串 */
for(int i = 1;i<=(n<<1);i++)
{
if(a[i]>mina)
{
if(pos!=-1)
{
mlen = std::max(mlen,i-pos+1);
}
else //此时a[i]是第一个比mina大的数
{
mlen = std::max(mlen,1);
pos = i;
}
}
else
pos=-1;
}
long long result = (long long)(mlen+mina*n);
printf("%I64d",result);
return 0;
}
学习点:思路(注意:这道题是在环内求解)
最长字串的求法