codeforce 1555C

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';
	}
}	

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值