zoukankan      html  css  js  c++  java
  • BZOJ1191: [HNOI2006]超级英雄Hero

    BZOJ1191: [HNOI2006]超级英雄Hero

    Description

    现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金。
    主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰。
    为了增加节目的趣味性并适当降低难度,主持人总提供给选手几个“锦囊妙计”,比如求助现场观众,或者去掉若干个错误答案(选择题)等等。
    这里,我们把规则稍微改变一下。
    假设主持人总共有m道题,选手有n种不同的“锦囊妙计”。
    主持人规定,每道题都可以从两种“锦囊妙计”中选择一种,而每种“锦囊妙计”只能用一次。
    我们又假设一道题使用了它允许的锦囊妙计后,就一定能正确回答,顺利进入下一题。
    现在我来到了节目现场,可是我实在是太笨了,以至于一道题也不会做,每道题只好借助使用“锦囊妙计”来通过。
    如果我事先就知道了每道题能够使用哪两种“锦囊妙计”,那么你能告诉我怎样选择才能通过最多的题数吗?

    Input

    输入文件的一行是两个正整数n和m(0 < n <1001,0 < m < 1001)表示总共有n中“锦囊妙计”,编号为0~n-1,总共有m个问题。
    以下的m行,每行两个数,分别表示第m个问题可以使用的“锦囊妙计”的编号。
    注意,每种编号的“锦囊妙计”只能使用一次,同一个问题的两个“锦囊妙计”可能一样。

    Output

    第一行为最多能通过的题数p

    Sample Input

    5 6
    3 2
    2 0
    0 3
    0 4
    3 2
    3 2

    Sample Output

    4
    题解Here!

    一看,这不是裸的二分图匹配吗?

    再看数据范围: N,M<=1,001 ,直接匈牙利啊!

    然后莫名 WA 了。。。

    再读题,我发现我是个zz。。。

    如果某题不能回答正确,不能进入下一题。。。

    于是加了个 break 。

    然后就 A 了,尴尬。。。

    附代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #define MAXN 1010
    using namespace std;
    int n,m,f[MAXN];
    bool vis[MAXN],a[MAXN][MAXN];
    inline int read(){
        int date=0,w=1;char c=0;
        while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
        while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
        return date*w;
    }
    bool find(int x){
        for(int i=1;i<=n;i++)
        if(a[x][i]&&!vis[i]){
            vis[i]=true;
            if(f[i]==-1||find(f[i])){
                f[i]=x;
                return true;
            }
        }
        return false;
    }
    void work(){
        int ans=0;
        for(int i=1;i<=m;i++){
            memset(vis,false,sizeof(vis));
            if(find(i))ans++;
            else break;
        }
        printf("%d
    ",ans);
    }
    void init(){
        int x,y;
        memset(f,-1,sizeof(f));
        memset(a,false,sizeof(a));
        n=read();m=read();
        for(int i=1;i<=m;i++){
            x=read()+1;y=read()+1;
            a[i][x]=a[i][y]=true;
        }
    }
    int main(){
        init();
        work();
        return 0;
    }
    
  • 相关阅读:
    设计工具
    makefile介绍1.0
    cpp命名空间
    第二课 生活智慧
    第一课 我想找到好工作,我想挣钱
    php CURL
    apache 改变文档根目录www的位置
    yii2 模块的创建及使用
    yii2 源码分析Action类分析 (六)
    yii2 源码分析 model类分析 (五)
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/9383061.html
Copyright © 2011-2022 走看看