C. Coin Rows
题目的意思是让Alice先走拿走一些硬币,然后再让Bob开始走,问两个人最佳操作,Bob最多拿多少个硬币。
思路:对于Alice来说,只会往下走一次。
所以有Z字型和L字型(边界)的走法,先用前缀和预处理。
如果是Z字型,那么每次把两边最大与之前的最小值判断即可。另外一种,则是边界为0的情况需要特殊判断一下。
ac代码如下
`#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define sc second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define rep(i,m,n) for(int i=m;i<n;i++)
#define repn(i,m,n) for(int i=m;i<=n;i++)
#define inf 0x3f3f3f3f
const int maxn=5e6+7;
int t,n;
int a[2][maxn];
int sum[2][maxn];
signed main(){
cin>>t;
memset(sum,0,sizeof(sum));
while(t--){
scanf("%d",&n);
rep(i,1,n+1){
scanf("%d",&a[0][i]);
sum[0][i]=sum[0][i-1]+a[0][i];
}
rep(i,1,n+1){
scanf("%d",&a[1][i]);
sum[1][i]=sum[1][i-1]+a[1][i];
}
if(n==1){
cout<<0<<endl;
continue;
}
int resa=inf;
int resb=inf;
int x1,x2;
rep(i,1,n+1){
if(i==1){
x1=sum[0][n]-sum[0][i];
x2=0;
}
else if(i==n){
x1=0;
x2=sum[1][i-1]-sum[1][0];
}
else{
x1=sum[0][n]-sum[0][i];
x2=sum[1][i-1]-sum[1][0];
}
resb=min(resb,max(x1,x2));
}
cout<<resb<<'\n';
}
}