Codeforces Round #217 (diy.2) B. Berland Bingo

题目链接:点击打开链接


题意: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值