真实的谎言-想法

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

 

Source

 

ygx2468

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<queue>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<cmath>
 8 using namespace std;
 9 #define sr(x) scanf("%d",&x)
10 #define sc(x) printf("%d",x)
11 #define hh printf("\n")
12 #define mod 2011
13 int main()
14 {
15     int x[100005],y[100005],a,b,n,i,tt,ss,mm;
16      cin>>tt;
17      while(tt--)
18      {
19          mm=0;
20         ss=0;
21          cin>>n;
22          for(i=0;i<=n;i++)x[i]=0,y[i]=0;
23          for(i=0;i<n;i++)
24          {
25              cin>>a>>b;
26              if(a==0&&b>0)a=1;
27              else if(a==0&&b==0) continue;
28              if(a<=n)x[a]+=1;
29              if(b<=n)y[b+1]+=1;
30              else y[n+1]++;
31          }
32          //for(i=1;i<=n;i++)cout<<x[i]<<endl;
33          for(i=1;i<=n;i++)
34          {
35              ss=ss+x[i]-y[i];
36              //cout<<ss<<i<<endl;
37              if(ss==i)mm=ss;
38          }
39          if(mm==0)cout<<-1<<endl;
40          else cout<<mm<<endl;
41      }
42     return 0;
43 }

 

posted on 2013-11-08 00:44  lveternal  阅读(192)  评论(0编辑  收藏  举报

导航