题解
这是一道大水题,然而我卡了1个半小时都没做出来,就是因为我搞反了时区的概念,必须挂出来,警示自己!!! 首先明确时区的概念,如果一区为1时的时候,i区的本地时间为i时。 好,那么这道题就很容易了,首先得到可用时间段长度为f-s。 然后我们用固定窗口的方法,固定一个长度为f-s的窗口,框住一段和最大的子序列,记这段子序列开始的位置为beg。 我们假设在beg时区时当地时间为s时,在1区的当地时间为x。我们有公式:
x+(beg−1)=s
x
+
(
b
e
g
−
1
)
=
s
即
x=s−(beg−1)
x
=
s
−
(
b
e
g
−
1
)
值得注意的是,如果x得到的结果
<1
<
1
<script type="math/tex" id="MathJax-Element-126"><1</script>还要将
x+=n
x
+
=
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;
}