悄悄话游戏 NOJ 1080

悄悄话游戏

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 339            测试通过 : 166 

题目描述

现在我们来玩一个游戏:传播“悄悄话”,规则如下:

1)一个人发起“悄悄话”

2)一个人在知道“悄悄话”时,要么保持沉默,不告诉任何人;要么在规定时间内将“悄悄话”及时告诉其他两个人,否则游戏失败。

3)所有人最终都知道“悄悄话”

假设一个人在规定时间内至多将“悄悄话”告诉两个人;除发起人外,其他每个人只被告诉一次“悄悄话”。给定游戏的统计数据,请你判断游戏是否成功。



输入

第一行是一个正整数:测试用例数目,最多为3。之后,每个测试用例包括多行:

l       1行给出两个整数(空格分割),前者表示游戏参与人数n,后者表示“悄悄话”的发起人t,在这个游戏中,参加人用整数序号表示,2n≤100010tn-1

l       2行给出一个整数,表示“悄悄话”传播的次数m0m≤10000

l       m行,每行两个整数(空格分割),前者表示“悄悄话”的告诉人,后者表示“悄悄话”的被告诉人

输出

对于每个测试用例:

l       游戏成功则输出“Success”,否则输出“Failure

注意:输出部分的结尾要求包含一个多余的空行。

样例输入

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

样例输出

Success
Failure

分析:定义两个数组a[],b[],前者用来存储每个人传悄悄话的次数,如果成功那么取值一定为2或0,后者用来记录每个人是否知道悄悄话(知道为1,不知道为0)。

实现代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int num,t,n,ti;
int a[10001+10];
int b[10001+10];
int main()
{
    scanf("%d",&num);
    while(num--)
    {
        scanf("%d%d%d",&n,&t,&ti);
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        b[t]=1;
        for(int i=0;i<ti;i++)
        {
            int n1,n2;
            scanf("%d%d",&n1,&n2);
            a[n1]++;
            b[n2]=1;
        }
        int f=1;
        for(int i=0;i<n;i++)
        {
            if(a[i]!=2&&a[i]!=0)
            {
                f=0;
                break;
            }
            if(b[i]!=1)
            {
                f=0;
                break;
            }
        }
        if(f==0)
            printf("Failure
");
        else
            printf("Success
");
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/Tobyuyu/p/4965489.html