UVA12001 UVa Panel Discussion 题解

Doveqise

2019-03-08 17:30:15

Solution

中文题意: 有n个队伍,来自m个国家, 现在给出了 #### 3个队伍的可能情况 1. 三个都来自一个国家 2. 三个都来自不同的国家; #### 和4个队伍的可能情况: 3. 有三个来自不同的国家 4. 至少有三个相同的国家 请帮助他们计算出他们可以按照上述限制做出的不同选择的数量。 --by [Kdlyh](https://www.luogu.org/space/show?uid=77076) 这道题其实就是一个计数问题 ~~(显然)~~ 我们只要根据题意一个个计数就好OwO 详见代码OuO ```cpp #include<bits/stdc++.h> using namespace std; const int maxn = 100+5; int n,m,num[maxn]; int main(){ while (scanf("%d%d",&n,&m)&&n&&m){ memset(num,0,sizeof(num)); for(int i=0;i<n;i++){int a;scanf("%d",&a);num[a-1]++;}//读入 int ans1=0,ans2=0,sum=0; for(int i=0;i<m;i++){ if(num[i]>=3) ans1+=num[i]*(num[i]-1)*(num[i]-2)/6;//三人满足相同国家 for(int j=i+1;j<m;j++) for(int k=j+1;k<m;k++) ans1+=num[i]*num[j]*num[k];//三人满足不同国家 } for(int i=0;i<m;i++){sum+=num[i];}//加和 for(int i=0;i<m;i++){ if(num[i]>=3){ int tmp=num[i]*(num[i]-1)*(num[i]-2)/6; ans2+=tmp*(sum-num[i]); ans2+=tmp*(num[i]-3)/4; }//三人满足相同国家 } for(int i=0;i<m;i++) for(int j=i+1;j<m;j++) for(int k=j+1;k<m;k++) { ans2+=num[i]*(num[i]-1)/2*num[j]*num[k]; ans2+=num[i]*num[j]*(num[j]-1)/2*num[k]; ans2+=num[i]*num[j]*num[k]*(num[k]-1)/2; }//三个不同国家计数 for(int i=0;i<m;i++) for(int j=i+1;j<m;j++) for(int k=j+1;k<m;k++) for(int l=k+1;l<m;l++){ ans2+=num[i]*num[j]*num[k]*num[l];// } printf("%d %d\n",ans1,ans2); } return 0; } ```