原题链接:https://www.acwing.com/problem/content/5367/
题目思路:牛按照环来报数,要求给定的[l,r)区间内的奶牛重量之和最大,并且第一个奶牛的报数要尽可能小。这里的环比较难处理,所以要用到破环成链的思路,复制两倍的数组,这样就可以得到所有的可能性,因为要快速地去求一个区间和,所以要用到前缀和算法。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+10;
//因为要开两倍,所以要注意N的范围
int a[N],n,l,r;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[n+i]=a[i];//复制数组
}
cin>>l>>r;
for(int i=1;i<=2*n;i++)
{
a[i]+=a[i-1];//处理前缀和
}
int len=r-l,res=0,num=0;
//求出区间长度
for(int i=len;i<=2*n;i++)//枚举区间终点
{
int x=a[i]-a[i-len],y=r-i;
//这里x是区间和,y是根据映射求出来的第一头牛报的数字
//注意区间是左闭右开
//r是第i头牛后一个牛报的数字,i是牛的编号,r-i就是第一头牛报的数字
while(y<1)//注意要让y在正常范围内,有可能加上2*n所以也要用while
{
y+=n;
}
if(res<x||(res==x&&y<num))//更新
{
res=x;
num=y;
}
}
cout<<num;
return 0;
}