题意:
有n对数(a,b),现在你可以将前x对(a,b)移到尾部。
操作完后,现在定义sum=ai-bi (1,x),当sum<0时,当前的价值为Σai (1<=i<=x-1)。
问你移动前多少对(a,b),使得价值最大,如果有多个答案,输出最小的那个。
题解:
复制一份,双指针模拟一下就行了。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 const int N=2e6+7; 6 int n,a[N],b[N],ans,ansval; 7 8 int main(){ 9 while(~scanf("%d",&n)) 10 { 11 F(i,1,n)scanf("%d",a+i),a[i+n]=a[i]; 12 F(i,1,n)scanf("%d",b+i),b[i+n]=b[i]; 13 ans=0,ansval=0,n*=2; 14 int l=1,sum=0,val=0; 15 F(r,1,n) 16 { 17 sum+=a[r]-b[r],val+=a[r]; 18 if(val>ansval)ans=l-1,ansval=val; 19 while(sum<0||r-l+1>n) 20 sum-=a[l]-b[l],val-=a[l],l++; 21 } 22 printf("%d\n",ans); 23 } 24 return 0; 25 }
时间: 2024-11-12 12:26:21