zoj 3757 Alice and Bob and Cue Sports

模拟题:

首先是击球犯规:

1.没击中球     对手+目标球分数

2.击中球且母球入袋    对手+击中球最大分数

3.击中球且母球没入袋   未击中目标或击中多个球    对手+击中球最大分数

然后是进球得分:

如果没犯规且目标求入袋  自己+总分

否则  对手+总分


找了半天错误,原来是判断母球入袋的时候没有判断in!=0 ,因为可能是上一次的母球入袋


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;

const int N=1005;
int n,m,hit,in,P[2],goal,turn;
int a[N],b[N],c[N],used[10*N];

void solve();
void update();

int main(){
	while(cin>>n>>m){
		P[0]=P[1]=0,goal=1,turn=0;
		memset(used,0,sizeof used);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+1+n);
		for(int i=0;i<m;i++){
			cin>>hit;
			for(int j=0;j<hit;j++)
				scanf("%d",&b[j]);
			sort(b,b+hit);
			cin>>in;
			for(int j=0;j<in;j++)
				scanf("%d",&c[j]);
			sort(c,c+in);
			solve();
			update();
			//printf("%d : %d--\n",P[0],P[1]);
		}
		printf("%d : %d\n",P[0],P[1]);
	}
	return 0;
}

void update(){
	for(int i=0;i<in;i++)
		used[c[i]]=1;
	while(used[a[goal]])
		goal++;
	turn=1-turn;
}

void solve(){
	int sum=0;
	for(int i=0;i<in;i++)
		sum+=c[i];
	if(hit==0){//没击中球
		P[1-turn]+=a[goal];
	}
	else if(c[0]==0&&in!=0){//母球入袋--wa--要先判断是否有球入袋,否则可能是上一次的
		P[1-turn]+=b[hit-1];
	}
	else if(hit>1||(hit==1&&b[0]!=a[goal])){//过多或不是目标球
		P[1-turn]+=b[hit-1];
	}
	else{//只击中目标球--无犯规
		if(in==0) return;
		int loc=lower_bound(c,c+in,a[goal])-c;
		if(c[loc]==a[goal]){//目标球进了
			P[turn]+=sum;
			turn=1-turn;
			return;
		}
	}
	if(in==0) return;
	P[1-turn]+=sum;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值