POJ 3640 Conformity

 

 

题意:n个学生,每人5门课程代号(100~499)的组合,定义这些课程组合的重复次数为受欢迎度。问选受欢迎度最大的课程组合的学生人数是多少。

 

题解:将每个学生所选的5门课进行从小到大排序,拼起来组成一个15位的数。即:

 for(int j=0;j<5;j++)
                 temp=temp*1000+x[j];

 由于变换之后的数太大,所以要哈希一下在存储。接下来再判重即可。

 

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 
 7 const long long MOD=100007;
 8 long long Hash[MOD],pos[MOD],pop[MOD],x[6];
 9 
10 int Getkey(long long num){
11     int temp=num%MOD;
12     while(Hash[temp]!=-1&&Hash[temp]!=num)
13         temp=(temp+1)%MOD;
14     return temp;
15 }
16 int main()
17 {
18     int n;
19     while(scanf("%d",&n),n){
20         long long ans=0;
21         memset(pop,0,sizeof(pop));
22         memset(Hash,-1,sizeof(Hash));
23         for(int i=0;i<n;i++){
24             for(int j=0;j<5;j++)
25                 scanf("%I64d",&x[j]);
26             sort(x,x+5);
27             long long temp=0;
28             for(int j=0;j<5;j++)
29                 temp=temp*1000+x[j];
30             int  ps=Getkey(temp);
31             Hash[ps]=temp;
32             ans=max(ans,++pop[pos[i]=ps]);
33         }
34         int cnt=0;
35         for(int j=0;j<n;j++){
36             if(pop[pos[j]]==ans)
37                 cnt++;
38         }
39         printf("%d\n",cnt);
40     }
41     return 0;
42 }

 

posted on 2012-12-11 13:13  Acmer_Roney  阅读(344)  评论(0编辑  收藏  举报

导航