Codeforces 442A Borya and Hanabi

有五种花色 外加 五种点数 共25张牌,每次有n张牌,主人知道这n张牌中有哪些牌,并且哪种牌有几张,但是不知道具体是哪张牌,他可以问某种花色,然后知道了哪几张是该花色,也可以问点数,然后就知道了哪几张是这个点数。最终可以把所有牌都确定下来,问最少要询问几次。

这个题目一开始想到枚举(事实证明最后就是枚举),然后又想到二分图去了,。。主要是这个花色对应点数,连成边之后太像二分图了,而且感觉为了得到所有的牌,隐隐约约有点像 DAG上的最小点覆盖。。。而且看了下样例,有点像,所以就去敲二分图去了,结果。。。擦。跪了

其实还是要回到枚举上面来,总共才10个点是不是,用个状态压缩才1000,关键是怎么判断当前枚举是合法的,正向考虑会比较复杂,我想了半天没想到一个比较轻松的方法,但是反向考虑就舒服多了,假设我枚举了k个点,也就是说这k个点(包括花色与点数)都是要询问的,那么不成立的条件有这样:

1.某种牌的两个端点都没询问,而且不止一次(如果只是一次的话,是可以的,因为主人知道所有的牌,这张牌放到最后即可)。

2.某种牌只访问了一个端点,但是这个端点又不止被访问一次(这样的话就肯定无法确定是哪张牌)

所以只要出现了以上两种情况中的一种,即不合法。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int mat[15][15];
char ch[6]={‘A‘,‘R‘,‘G‘,‘Y‘,‘W‘,‘B‘};
int bitcount(int x)
{
    if (x==0) return 0;
    else return bitcount(x>>1)+(x&1);
}
bool judge(int x)
{
    int num[20];
    memset(num,0,sizeof num);
    int tot=0;
    for (int i=1;i<=5;i++)
    {
        for (int j=6;j<=10;j++){
            if (mat[i][j]){
                if (((1<<(i-1))&x) && (!((1<<(j-1))&x))) num[i]++;
                if ((!((1<<(i-1))&x)) && ((1<<(j-1))&x)) num[j]++;
                if ((!((1<<(i-1))&x)) && (!((1<<(j-1))&x))) tot++;
            }
        }
    }
    //cout<<tot<<endl;
    if (tot>1) return 0;
    for (int i=1;i<=10;i++){
            if (num[i]>1) return 0;
    }
    return 1;
}
int main()
{
    int n;
    char s[3];
    while (scanf("%d",&n)!=EOF)
    {
        memset(mat,0,sizeof mat);
        for (int i=0;i<n;i++){
            scanf("%s",s);
            int a=0;
            for (int i=1;i<=5;i++){
                if (s[0]==ch[i]){a=i;break;}
            }
            int b=s[1]-‘0‘+5;
            mat[a][b]=1;
           // cout<<a<<" "<<b<<endl;
        }
        int ans=100;
        for (int i=0;i<(1<<11);i++){
            if (judge(i)){
                ans=min(ans,bitcount(i));
            }
                //cout<<ans<<endl;
                //if (ans==0) break;
            }
        printf("%d\n",ans);
    }
    return 0;
}

Codeforces 442A Borya and Hanabi,布布扣,bubuko.com

时间: 2024-10-13 15:55:33

Codeforces 442A Borya and Hanabi的相关文章

Codeforces 443A Borya and Hanabi(暴力)

题目链接:Codeforces 443A Borya and Hanabi 题目大意:有若干个牌,每张牌有花色和数字两个值,现在问说至少询问多少次才能区分出所有的牌,每次询问可以确定一种花色牌的位置,或者是一种数字牌的位置. 解题思路:暴力枚举需要问的花色和数字,210,然后枚举两两判断是否可以被区分. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

Codeforces Round #253 (Div. 2)——Borya and Hanabi

题目连接 题意: n表示有n个卡片,每个卡片有一种颜色和一个数字(共五种不同的颜色和五个不同的数字).事先知道每种卡片有几张,但是不知道具体的位置.问需要几次提示就可以知道所有卡片的位置都在哪里:每次提示可以选择一个颜色或者一个数字,就可以知道含有所选属性的牌有哪些. 分析: 首先明白总情况数不多,只有2^10,所以枚举. 能确定某张牌位置的情况:1)提示了一个属性,而这个属性只有一张牌 2)某个属性有n张牌,知道了n-1张牌的位置 两个提示确定一张牌:必然的,只要存在这张牌,那么两个提示必然可

[CF442A] Borya and Hanabi (暴力bitmask)

题目链接:http://codeforces.com/problemset/problem/442/A 题目大意:给你n张卡片,你知道这n张卡片都是什么,但是不知道他们的位置.你每次可以请求朋友指出一种颜色的卡片,或者一种数字的卡片.问你最少需要多少次能够知道每个卡片的位置. 首先,如果其他所有卡片都知道了,最后一张卡片不需要指示就知道了. 然后我们枚举哪张是最后一张卡片. 将五种颜色放在x轴,5个数字放在y轴. 一次询问就是画一条线,先去掉交叉点,再看剩下的点是不是唯一在一条直线里. bitm

暑假集训-个人赛第三场

ID Origin Title 10 / 29 Problem A CodeForces 443B Kolya and Tandem Repeat   1 / 1 Problem B CodeForces 442A Borya and Hanabi 9 / 29 Problem C CodeForces 442B Andrey and Problem 3 / 17 Problem D CodeForces 442C Artem and Array 14 / 18 Problem E CodeFo

Codeforces Round 253 (Div. 2)

layout: post title: Codeforces Round 253 (Div. 2) author: "luowentaoaa" catalog: true tags: mathjax: true - codeforces - 模拟栈 - 贪心 传送门 A.Anton and Letters (签到) 题意 判断字符串里面有多少个不同字符 思路 直接set一下 #include<bits/stdc++.h> using namespace std; typed

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

codeforces练习

DZY Loves Colors Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-07) Description DZY loves colors, and he enjoys painting. On a colorful day, DZY gets a colorf

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b