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 阅读(345) 评论(0) 编辑 收藏 举报