AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

【题解】AtCoder Beginner Contest 147: C - HonestOrUnkind2

作者: 作者的头像   Alier ,  2019-12-21 14:02:54 ,  所有人可见 ,  阅读 890


0


点这里跳转题目

一言不合就暴力枚举……比赛的时候看N<=15+一时半会儿想不到好方法的时候应该就可以开始暴力了

(这种判断真话假话的题好像属于NP完全问题,目前还没有非指数级的办法,只能用随机算法把底数变小)
(新手村的菜鸡还是暴力枚举吧Q-Q)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int numz[16];//存每个人说了几句话
int n;
int ans;
vector<pair<int,int>> kotoba[16];//存每个人说的每句话

int main(){
    cin>>n;

    //读入
    for(int i=1;i<=n;i++){
        cin>>numz[i];
        for(int j=1;j<=numz[i];j++){
            int l,r;
            cin>>l>>r;
            kotoba[i].push_back({l,r});
        }
    }

    //位运算枚举每一种状况,最多2^15次方种
    for(int i=0;i<1<<n;i++){
        int cnt=0;
        int flag=false;
        for(int j=0;j<n;j++){
            if(i>>j &1 ==1){
                cnt++;
                for(int k=0;k<numz[j+1];k++){
                    auto p=kotoba[j+1][k];
                    int l=p.first,r=p.second;
                    if((i>>(l-1)&1) != r) {//说的话和真实情况有矛盾,这种状况就不行
                        flag=true;
                        break;
                    }
                }
            }
            if(flag==true) break;
        }
        if(flag==false) ans=max(ans,cnt);//取说真话的人最多者
    }
    cout<<ans<<endl;
    return 0;

}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息