题目链接:点击打开链接
题意:N个人玩BINGO游戏,每个人手里都有一张卡片,卡片上有Mi个不同的数。
每个人手里的卡片可能相同。有一个人从箱子里取出编号为1-100的球,然后报出数,
卡片上有相应数字的人可以划掉那个数字,最先将自己卡片上所有数字划完的人WIN。
如果同时完,则都输。问这些人的输赢情况。
最关键的一句话就是怎么判断输赢:
Write a program that determines whether a player can win the game
at the most favorable for him scenario or not.
比赛的时候理解错了。。。。
自己结合数据,以为就报数是从小到大报数的。。划掉数字也是按报数顺序的。。。这样就写错了。。
还是不能想当然的去理解题意。。。
正确思路:
拿i卡片的人能赢,则其余卡片上的数都不是i卡片上数的子串。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;
int a[110][110];
string ans[110];
bool cmp(int x,int y)
{
return x>=y;
}
bool isin(int x,int y)
{
for(int i=0;a[x][i];i++)
{
bool in=false;
for(int j=0;a[y][j];j++)
{
if(a[x][i]==a[y][j])
in=true;
}
if(!in)
return false;
}
return true;
}
int main()
{
int n,d;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
ans[i]="YES";
for(int i=0;i<n;i++)
{
scanf("%d",&d);
for(int j=0;j<d;j++)
scanf("%d",&a[i][j]);
//sort(a[i],a[i]+d,cmp);
}
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(isin(i,j))
ans[j]="NO";
if(isin(j,i)) //j ?in i
ans[i]="NO";
}
}
for(int i=0;i<n;i++)
cout<<ans[i]<<endl;
}
return 0;
}