CF_315A_Sereja and Bottles
用x[i]表示brand为i的瓶子有多少个,用y[i]表示能开brand为i的瓶子的瓶子有多少个
情况分为三种:
1、a[i]!=b[i],那么b[i]能开所有的x[a[i]]
2、a[i]==b[i]&&b[i]>1,那么b[i]能开所有的x[a[i]]
3、a[i]==b[i],那么b[i]能开x[a[i]]-1
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<queue> using namespace std; int a[1005],b[1005]; int x[1005],y[1005]; int main() { int n; while(~scanf("%d",&n)) { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); for(int i=0;i<n;++i) { scanf("%d%d",&a[i],&b[i]); x[a[i]]++; y[b[i]]++; } int sum=0; for(int i=0;i<n;++i) { if(x[b[i]]) { if(a[i]!=b[i]) { sum+=x[b[i]]; x[b[i]]=0; } else if(y[a[i]]>1) { sum+=x[b[i]]; x[b[i]]=0; } else if(x[b[i]]>1) { sum+=x[b[i]]-1; x[b[i]]=1; } } } printf("%d\n",n-sum); } return 0; }