题解
这是一道大水题,然而我卡了1个半小时都没做出来,就是因为我搞反了时区的概念,必须挂出来,警示自己!!!
首先明确时区的概念,如果一区为1时的时候,i区的本地时间为i时。
好,那么这道题就很容易了,首先得到可用时间段长度为f-s。
然后我们用固定窗口的方法,固定一个长度为f-s的窗口,框住一段和最大的子序列,记这段子序列开始的位置为beg。
我们假设在beg时区时当地时间为s时,在1区的当地时间为x。我们有公式:
x+(beg−1)=sx+(beg−1)=s 即 x=s−(beg−1)x=s−(beg−1)
值得注意的是,如果x得到的结果<1<1<script type="math/tex" id="MathJax-Element-126"><1</script>还要将x+=nx+=n
由于可能存在多个合理答案,这个题目要求数值最小的!
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1e6+7;
int a[maxn],b[maxn];
int n,s,f;
int main(){scanf("%d",&n);for(int i = 1;i <= n;++i) scanf("%d",&a[i]);scanf("%d%d",&s,&f);int ans = n;int inter = f - s;int sum = 0,mx = 0,mark = 1;for(int i = 1;i <= inter;++i) sum += a[i];mx = sum;ans = s;for(int beg = 2;beg <=n;++beg){int end = beg+inter-1;end = end > n?end-n:end;sum -= a[beg-1];sum += a[end];int t = beg-1;if(sum > mx){mx = sum;ans = s-t <= 0?s-t+n:s-t;}else if(sum == mx){ans = min(ans,s-t<=0?s-t+n:s-t);}}printf("%d\n",ans);return 0;
}