zoukankan      html  css  js  c++  java
  • Vijos1221:神秘的配方

    背景

    每天中午的下课铃一响,浙江镇海中学的同学们都会冲出学校来附近的小饭馆吃饭,刹那间天昏地暗,飞砂走石,家家餐馆内都是一片黑压压的人 。馄饨店、饺子馆,在学校附近开一家红一家。身为镇海中学信息中心首席科学顾问兼资深信息学竞赛辅导老师Dennis看到了,他为了在业余时间方便学生,他租了学校附近的一家店面,雇了几个拉面师傅,开了一家“正宗兰州牛肉拉面馆”,生意还不错。

    描述

    Dennis的拉面馆隆重开张后,虽然生意很好,但是由于Dennis相信“没有最好,只有更好”(就像他对算法复杂度的不懈追求),于是他带领着他的徒弟光光和娃娃一起来到拉面的故乡——甘肃的兰州,寻找传说中世界上最好吃的拉面……
    在当地人的指导下,Dennis 一行来到了一个偏僻的小村子,传说这个村子就盛产世界上最好吃的拉面。可是Dennis很快发现了这个村子的村民的奇特之处:这些村名喜欢说谎话。由于完全说谎话很容易会被识破,所以他们会有时说真话而有时说假话,好在经过调查,光光已经知道了村民的这个习俗。为了获得传说中美味拉面的神秘配方,Dennis精心设计了n个问题,每个问题只需回答“是”或“否”就行,然后根据答案,他就能得到拉面的秘方。于是光光和娃娃问了m个不同的村民,对于每个村民,从n个问题中挑出2个不同的问题问他,并纪录下答案交予Dennis统计。可是Dennis发现这样的统计太复杂和困难了,于是他想知道根据村名的回答,n个问题的答案可能有的情况总数。

    格式

    输入格式

    第一行是两个整数n(1<=n<=200),m(0<=m<=10000),分别表示Dennis准备了n个问题,问了m个不同的村名。接下去m行,第i+1行有四个整数a,b,c,d(1<=a,c<=n),表示第i个村民对第a个问题的答案是b,对第c个问题的答案是d。当b或d是0时表示答案为“否”,是1时表示答案为“是”。一个村民在回答时不会中途改变其说谎性,即他要么一直说真话,要么一直说假话。但我们不知道他到底在说真话还是假话。

    输出格式

    一个整数,表示可能的情况总数。如果不可能,则输出“No Answer”

    输入1:

    2 2
    1 1 2 0
    1 1 2 1

    输出1:

    No Answer

    输入2:

    4 4
    1 1 2 1
    1 1 3 0
    2 1 4 1
    3 1 4 0

    输出2:

    2

    思路:2集合问题注意高精度。

    #include <iostream>
    #include <string.h>
    using namespace std;
    const int MAXN=2005;
    int n,m;
    int par[MAXN];
    int vis[MAXN];
    void prep()
    {
        for(int i=0;i<MAXN;i++)
        {
            par[i]=i;
        }
    }
    int fnd(int x)
    {
        if(par[x]==x)
        {
            return x;
        }
        return par[x]=fnd(par[x]);
    }
    void unite(int x,int y)
    {
        int a=fnd(x);
        int b=fnd(y);
        par[a]=b;
    }
    bool same(int x,int y)
    {
        return fnd(x)==fnd(y);
    }
    int main()
    {
        prep();
        cin>>n>>m;
        bool mark=true;
        for(int i=0;i<m;i++)    
        {
            int a,b,c,d;
            cin>>a>>b>>c>>d;
            if(mark)
            {
                if(b==d)
                {
                    if(!same(a,c+n))
                    {
                        unite(a,c);
                        unite(a+n,c+n);
                    }
                    else
                    {
                        mark=false;
                    }
                }
                else
                {
                    if(!same(a,c))
                    {
                        unite(a,c+n);
                        unite(a+n,c);
                    }
                    else
                    {
                        mark=false;
                    }
                }
            }
        }
        if(mark)
        {
            int cnt=0;
            for(int i=1;i<=n;i++)
            {
                int root=fnd(i);
                if(root<=n&&!vis[root])
                {
                    cnt++;
                    vis[root]=1;
                }
            }
            int res[MAXN],len;
            res[0]=1;
            len=1;
            for(int i=0;i<cnt;i++)
            {
                int up=0;
                for(int j=0;j<len;j++)
                {
                    int z=2*res[j]+up;
                    res[j]=z%10;
                    up=z/10;
                }
                if(up!=0)    res[len++]=up;
            }
            for(int i=len-1;i>=1;i--)
            {
                cout<<res[i];
            }
            cout<<res[0]<<endl;
        }
        else
        {
            cout<<"No Answer"<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    19年春第六周学习
    Java编程思想
    个人作业4-结对开发地铁
    Hadoop学习笔记—1.基本介绍与环境配置
    ZooKeeper学习第二期--ZooKeeper安装配置
    ZooKeeper学习第一期---Zookeeper简单介绍
    loadrunner--参数化—使用数据文件参数化
    loadrunner--analysis--图表筛选、合并、显示
    loadrunner--并发测试
    session和cookie
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5365399.html
Copyright © 2011-2022 走看看