真实的谎言-想法
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 }