codeforces 939C Convenient For Everybody 简直羞耻

xiaoxiao2021-02-28  56

题解

这是一道大水题,然而我卡了1个半小时都没做出来,就是因为我搞反了时区的概念,必须挂出来,警示自己!!! 首先明确时区的概念,如果一区为1时的时候,i区的本地时间为i时。 好,那么这道题就很容易了,首先得到可用时间段长度为f-s。 然后我们用固定窗口的方法,固定一个长度为f-s的窗口,框住一段和最大的子序列,记这段子序列开始的位置为beg。 我们假设在beg时区时当地时间为s时,在1区的当地时间为x。我们有公式: x+(beg1)=s x + ( b e g − 1 ) = s x=s(beg1) 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; }
转载请注明原文地址: https://www.6miu.com/read-2624750.html

最新回复(0)