hdu 6205

来源:互联网 发布:甘肃干部网络考试答案 编辑:程序博客网 时间:2024/06/06 00:05

一开始想麻烦了;

可以用尺取法做,为o(n);

在群里一个buaa的聚聚说了一种思路,可以用优先队列做,思想很好;

先复制一遍,对于答案x,你要找满足prea[t]-prea[x]-(prea[t]-prea[x])<0的最小t;

移项就是t<x;

就直接单调队列,找每个数右边第一个比他小的;

q神说,这个题有个前提,sum a=sum b;

一定存在一个位置能把所有牌取走;这样就只需判断是否长度为n就行

我思考了一下sum a!=sum b的情况下的代码

代码如下

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e6+5;int a[2*maxn];int b[2*maxn];int main(){ int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%d",&a[i]); a[i+n]=a[i]; } for(int i=0;i<n;i++){ scanf("%d",&b[i]); b[i+n]=b[i]; } int maxa=0,maxb=0,s=0,e=0; int p=0,ma=0; for(;;){ while(maxa>=maxb&&e-s<n){ maxa+=a[e]; maxb+=b[e]; e++; } if(maxa>ma){ p=s; ma=maxa; } if(e-s==n||e>2*n-1||s>n) break; maxa-=a[s]; maxb-=b[s]; s++; } printf("%d\n",p); }  } 


原创粉丝点击