模拟题,一定要根据题目意思!
#include <iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct ball{
int no,in; //球的编号,球是否在洞内
}Ball;
Ball goal_ball[1010];
int b1[1010],b2[1010];
int n,m;
int cmp(const void * a, const void * b)
{
Ball* _a = (Ball*)a;
Ball* _b = (Ball*)b;
return _a->no - _b->no;
}
int get_goal() //查找目标球
{
for(int i = 0;i < n;i++)
{
if(!goal_ball[i].in)
{
return goal_ball[i].no;
}
}
}
int main()
{
int ans[2] ;
while(scanf("%d %d",&n,&m)!= EOF)
{
ans[0] = 0,ans[1] = 0;
int cur = 0; //0表示Alice击打,1表示Bob
for(int i = 0; i < n;i++)
{
scanf("%d",&goal_ball[i].no);
goal_ball[i].in = 0;
}
qsort(goal_ball,n,sizeof(Ball),cmp);
int num1,num2;
for(int i = 0; i < m;i++)
{
scanf("%d",&num1); //击球数
for(int j = 0;j < num1;j++)
{
scanf("%d",&b1[j]);
}
sort(b1,b1 + num1);
scanf("%d",&num2); //进洞的球数
for(int j = 0;j < num2;j++)
{
scanf("%d",&b2[j]);
}
sort(b2,b2 + num2);
int goal = get_goal();
int pen = 0; //没犯规
if(num1 == 0) //没有击中球
{
cur = 1 - cur;
ans[cur] += goal;
pen = 1;
}
else if(num1 > 0 && num2 > 0 && b2[0] == 0) //击中球且母球入袋
{
cur = 1 - cur;
ans[cur] += b1[num1 - 1];
pen = 1;
}
else if(num1 > 1 || (num1 == 1 && b1[0] != goal)) //击中多余一个球或击中的不是目标球
{
cur = 1 - cur;
ans[cur] += b1[num1 - 1];
pen = 1;
}
else if (num2 == 0) //没犯规且没进球
{
cur = 1 - cur;
}
if(num2 > 0) //进洞了
{
if(pen) //犯规
{
for(int j = 0 ; j < num2;j++)
{
ans[cur] += b2[j];
int temp = b2[j];
for(int k = 0;k < n;k++)
{
if(goal_ball[k].no == temp)
goal_ball[k].in = 1;
}
}
}
else if(b2[0] != goal)//进洞的球中没有目标球
{
cur = 1 - cur;
for(int j = 0 ; j < num2;j++)
{
ans[cur] += b2[j];
int temp = b2[j];
for(int k = 0;k < n;k++)
{
if(goal_ball[k].no == temp)
goal_ball[k].in = 1;
}
}
}
else //没犯规并且目标球进洞
{
for(int j = 0 ; j < num2;j++)
{
ans[cur] += b2[j];
int temp = b2[j];
for(int k = 0;k < n;k++)
{
if(goal_ball[k].no == temp)
goal_ball[k].in = 1;
}
}
}
}
}
printf("%d : %d\n",ans[0],ans[1]);
}
return 0;
}