题意:
- 注意题目中没有0:00时 以及 s,f 的区间指左闭右开区间[s,f] 即可
做法:
- 就是找一段长度为 f-s-1的连续区间,使得这段区间的和最大,由于具有时间特性,所以要注意时间成环状的问题,所以我们在处理的时候,加倍处理即可。 比如: 1 2 3 4 1 -----> 1 2 3 4 1 1 2 3 4 1
- 自己脑子zz,居然写成了二分,这样容易错失最小答案……
wa的有点多(゚Д゚#)
AC代码:
#include<bits/stdc++.h>
#define IO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb(x) push_back(x)
#define sz(x) (int)(x).size()
#define sc(x) scanf("%d",&x)
#define pr(x) printf("%d\n",x)
#define abs(x) ((x)<0 ? -(x) : x)
#define all(x) x.begin(),x.end()
#define mk(x,y) make_pair(x,y)
#define debug printf("!!!!!!\n")
#define fin freopen("in.txt","r",stdin)
#define fout freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 3e5+5;
const int maxn = 2e5+10;
const int INF = 0x3f3f3f3f;
inline int read()
{
char x;
int u,flag = 0;
while(x = getchar(),x<'0' || x>'9') if(x == '-') flag = 1;
u = x-'0';
while(x = getchar(),x>='0' && x<='9') u = (u<<3)+(u<<1)+x-'0';
if(flag) u = -u;
return u;
}
struct node
{
int l,r;
int val;
}ans[maxn];
//bool cmp(node a,node b) 用二分可能会错失smallest answer!!!
//{
// return a.val<b.val;
//}
//vector<node> vec;
//struct cmp1
//{
// bool operator()(const node &a,const node &b)const{
// return a.val<b.val;
// }
//};
int pos[maxn];
int a[maxn];
int sum[maxn];
int main()
{
#ifdef LOCAL_FILE
fin;
#endif // LOCAL_FILE
int n = read();
int s,f;
for(int i=1;i<=n;i++) a[i] = read();
for(int i=n+1;i<=2*n;i++) a[i] = a[i-n]; //加倍处理
for(int i=1;i<=2*n;i++) sum[i] = sum[i-1]+a[i];
s = read();
f = read();
int len = f-s; //由于题意定义,肯定是要连续的区间
int mx = -1;
int k = 0;
for(int i=1;i<=2*n;i++)
{
ans[i].l = i-len+1;
ans[i].r = i;
ans[i].val = sum[i]-sum[i-len];
mx = max(mx,ans[i].val);
}
for(int i=1;i<=2*n;i++)
{
if(ans[i].val == mx) pos[k++] = i;
}
// sort(ans+1,ans+1+2*n,cmp); 用二分可能会错失smallest answer!!! 脑子ZZ了 (T▽T)
// for(int i=1;i<=2*n;i++)
// vec.pb(ans[i]);
// node tmp;
// tmp.val = mx;
// auto it = lower_bound(vec.begin(),vec.end(),tmp,cmp1());
// cout<<(*it).l<<" "<<(*it).r<<endl;
// cal = (*it).l - 1;
int cal,res;
int fres = INF;
for(int i=0;i<k;i++)
{
cal = ans[pos[i]].l-1;
res = (s-cal+n)%n;
while(res<0) res = (res+n)%n; //answer>0
fres = min(res,fres);
}
if(fres == 0) fres = n;
printf("%d\n",fres);
return 0;
}