模拟题:
首先是击球犯规:
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;
}