真实的谎言(枚举)

Description

N个人做一个游戏,游戏中每个人说了一句话(可能是真的也可能是假的)
第i个人说:“N个人中有至少有ai个,至多有bi个人说的是真话!”(i = 1, 2, 3…..n)你能推断出最多能有多少个人说的是真话吗?
1 <= N <= 100000;
0 <= ai<=bi<=1000000000;

Input

第一行为一个整数T,代表测试数据的组数;
每组数据以n开头,接下来有n行,每行两个整数ai,bi(代表第i个人说的);

Output

输出占一行。如果原问题有解,输出最多能有多少个人说的是真话;否则输出-1.

Sample Input

2
3
0 0
1 1
2 2
3
2 5
3 5
0 3

Sample Output

1
3

这道题....主要在逻辑判断...想明白了就很容易了

先用一个数组man 统计出所有人认为有i 个人说实话之和 最后判断man[i]如果大于i 则表示只有i 个人认为man[i]个人说实话如4个人认为5个人说实话..显然不能成立  在考虑man[i]如果小于i  也不可能  只有man[i]==i 才符合逻辑,由于是要最多要从n开始,具体见代码

#include <iostream>
#include <cstdio>
#include <cstring>
#define max 100006
using namespace std;
int man[max],i,j,a,b;
int main()
{
    int n,t;
    freopen("in.txt","r",stdin);
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        memset(man,0,sizeof(man));
        for(i=1;i<=n;i++){
            scanf("%d%d",&a,&b);
            for(j=a;j<=b&&j<=n;j++)    man[j]++;
        }
        for(i=n;i>0;i--)  if(man[i]==i) {printf("%d\n",i);break;}
        if(i==0)   printf("-1\n");
    }
    return 0;
}

题目来源 UESTC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值