zoj 3757 Alice and Bob and Cue Sports

来源:互联网 发布:阿里云路由器怎么设置 编辑:程序博客网 时间:2024/06/08 17:18

模拟题:

首先是击球犯规:

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


0 0
原创粉丝点击