您的位置:首页 > 其它

codeforces 939C Convenient For Everybody 简直羞耻

2018-02-18 17:48 204 查看

题解

这是一道大水题,然而我卡了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还要将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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: