首页 > 其他分享 >Atcoder 356 C - Keys 二进制枚举

Atcoder 356 C - Keys 二进制枚举

时间:2024-07-30 18:27:10浏览次数:11  
标签:Atcoder Ci 356 Keys 次测试 int 钥匙 Ai include

原题链接:

https://atcoder.jp/contests/abc356/tasks/abc356_c 


C - Keys:

问题陈述

您有 N 个编号为1,2,…,N 的密钥。
其中一些是真钥匙,其他都是假钥匙。

有一扇门,门 X,你可以插入任意数量的钥匙。只有插入至少 K 把真钥匙,X 门才会打开。

你已经对这些钥匙进行了 M 次测试。 i 次测试过程如下:

  • 您将 Ci 把 Ai,1​,Ai,2​,…,Ai,Ci​​ 把钥匙插入了 X 号门。
  • 测试结果用一个英文字母 RiRi​ 表示。
    • Ri​= o`表示在 i /-测试中门X打开了。
    • Ri​= x "表示在 i /-次测试中门X没有打开。

有 2^N 种可能的钥匙组合,其中哪些是真钥匙,哪些是假钥匙。在这些组合中,找出与任何测试结果都不矛盾的组合数。
给定的测试结果有可能是错误的,没有任何组合满足条件。在这种情况下,请报告 0 。

限制因素
  • N 、 M 、 K 、 Ci​ 和 Ai,j​ 是整数。
  • 1≤K≤N≤15
  • 1≤M≤100
  • 1≤Ci​≤N
  • 1≤Ai,j​≤N
  • Ai,j≠Ai,k,如果 j≠kj=k .
  • Ri​ 是 o 或 x

思路讲解:

 __builtin_popcount(s&S[i])>=K 记录了s,和S[i]的二进制表示中,相同位置都为1的位数,

 __builtin_popcount此函数用来统计,二进制表示当中1的个数
一共n把钥匙,每种钥匙都有2种情况,真和假,因此,一共就有2的n次幂种可能,我们枚举每一种情况,看看有多少种情况是符合题干的即可、如果全为假,即为000,如果全为真表示为111,是2的n次幂-1,故数字枚举0到2的n次幂-1,要求如果有>=k把钥匙和能开门这两个条件是要同时成立的,否则这个方案就不是一个合理的方案



代码实现:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>

using namespace std;

typedef long long ll;

int main()
{
    int N,M,K;
    cin>>N>>M>>K;
    vector<int> S(M),R(M);
    for(int i=0;i<M;i++)
    {
        int C; cin>>C;
        for(int j=0;j<C;j++)
        {
            int x; cin>>x;
            x--;
            S[i]|=1<<x;//作用是将S[i]的第x位设为1,因为二进制是从第0位开始的,因此我们需要x--;
        }
        char r; cin>>r;
        R[i]=(r=='o'); //如果这种情况下是可以打开的,则R[i]=1;
    }
    int ans=0;
    for(int s=0;s<(1<<N);s++) //枚举2的n次幂种可能
    {
        int ok=1;
        for(int i=0;i<M;i++)
        {
            if( (__builtin_popcount(s&S[i])>=K) != R[i]) //若两者不是同时成立的,则代表出现了矛盾,则这种方案不满足
            {
                ok=0;
            }
        }
        ans+=ok;
    }
    cout<<ans<<endl;
    return 0;
}

 

标签:Atcoder,Ci,356,Keys,次测试,int,钥匙,Ai,include
From: https://blog.csdn.net/2302_79545206/article/details/140776062

相关文章

  • Solution - Atcoder APC001E Antennas on Tree
    首先考虑判定什么样的选取是合法的。考虑到令任意一个点\(u\)为根。若\(u\)有至少两个子树没有点选中,那么这两个子树是无法区分的。所以可以知道需要满足任意一个点为根,都至多存在一个子树内部没有选中的点。接下来就要贪心的选出最少的点了。考虑对于每个点的限制都是子......
  • 【RK3568】点亮eDP屏幕+双屏异显
    一、驱动eDP屏幕    一般来说,屏幕的规格书中会找到屏幕的相关参数,如没有,也可直接找屏幕厂商要,首先打开屏幕的规格书,搜索EDIDTable,可找到如下信息:    (1)显示时序配置        将这些参数对应到设备树中,即可完成下面修改,关键节点就是显示时序配置的d......
  • Solution - Atcoder AGC028B Removing Blocks
    因为贡献的方法是相加,一种想法就是拆开,对每一项单独贡献。不难发现这题目中的贡献其实只涉及到两点之间。即删除\(x\)时\(y\)也产生了贡献。考虑这个贡献会在多少种排列中出现。令\(d=|x-y|+1\),即\(x,y\)中的点数。能发现排列需要满足除\(x\)外的\(d-1\)......
  • Atcoder ABC364 D-F
    AtcoderABC364D-FD-K-thNearest链接:D-K-thNearest(atcoder.jp)简要题意:问题陈述在一条数线上有\(N+Q\)个点\(A_1,\dots,A_N,B_1,\dots,B_Q\),其中点\(A_i\)的坐标为\(a_i\),点\(B_j\)的坐标为\(b_j\)。请就每个点\(j=1,2,\dots,Q\)回答下面的问题:......
  • 温度补偿 MEMS 振荡器(TC-MO/VC TC-MO) - Super Low Jitter MO5155/MO5156/MO5157/MO535
    在当今科技高速发展的时代,电子设备对频率源的性能要求日益严苛。频率的稳定性、精度以及低抖动特性成为了决定设备性能的关键因素。温度补偿MEMS振荡器(TC-MO/VCTC-MO)以其出色的性能,正在逐渐成为电子领域的宠儿。本文将详细介绍SuperLowJitter系列的MO5155、MO5156、......
  • Solution - Atcoder YPC2019E Odd Subrectangles
    首先对于\(0/1\)和为奇数,转化为异或为\(1\)来考虑。考虑如果已经确定了行的选取,又该如何计数。考虑对于每一列,都处理好在对应行的位置的异或值。然后记\(\operatorname{c}_0,\operatorname{c}_1\)表示列异或值为\(0/1\)的数量。知道了\(\operatorname{c}_0,\op......
  • Solution - Atcoder UTPC2023P Priority Queue 3
    考虑找一些关于合法的\(X\)加入的数的判定条件。假设遇到了一个\(\operatorname{pop}\)操作,令这里删除的数为\(a_i\),显然\(X\)中的数应该要有\(a_i\),其次\(X\)中其他的加入的数要么\(>a_i\)要么是\(a\)中的元素(在前面的\(\operatorname{pop}\)就已经被删了)。于......
  • 案例源码公开!分享瑞芯微RK3568J与FPGA的PCIe通信案例,嵌入式必读!
    ARM+FPGA架构有何种优势近年来,随着中国新基建、中国制造2025的持续推进,单ARM处理器越来越难满足工业现场的功能要求,特别是能源电力、工业控制、智慧医疗等行业通常需要ARM+FPGA架构的处理器平台来实现特定的功能,例如多路/高速AD采集、多路网口、多路串口、多路/高速并行DI/DO......
  • AtCoder Beginner Contest 362
    AtCoderBeginnerContest362前言vp的时候出了四题,被C题卡了一会,很久才出,D题是dijkstra的板子,改下条件即可,E题是个计数dp,这类题一直不怎么擅长,想起之前杭电第一场那个序列立方的题也是类似这种计数dp,需要加强练习。A-BuyaPen(atcoder.jp)思路判断两两最小。......
  • Solution - Atcoder ABC280Ex Substring Sort
    对于这种子串问题,且有多个基础串,一个比较直观的想法就是先上个广义SAM。考虑SAM与字典序如何联系上。因为跳\(\operatorname{fail}\)相当于是删除子串的一个前缀,直接这样子明显是不行的,因为跳了\(\operatorname{fail}\)字典序没有一个很直观地表示。但是反过来考虑反串,......