POJ 3640 Conformity

来源:互联网 发布:淘宝马甲是什么意思啊 编辑:程序博客网 时间:2024/06/16 10:49

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

 

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

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

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

 

 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std;  const long long MOD=100007; long long Hash[MOD],pos[MOD],pop[MOD],x[6];  int Getkey(long long num){     int temp=num%MOD;     while(Hash[temp]!=-1&&Hash[temp]!=num)         temp=(temp+1)%MOD;     return temp; } int main() {     int n;     while(scanf("%d",&n),n){         long long ans=0;         memset(pop,0,sizeof(pop));         memset(Hash,-1,sizeof(Hash));         for(int i=0;i<n;i++){             for(int j=0;j<5;j++)                 scanf("%I64d",&x[j]);             sort(x,x+5);             long long temp=0;             for(int j=0;j<5;j++)                 temp=temp*1000+x[j];             int  ps=Getkey(temp);             Hash[ps]=temp;             ans=max(ans,++pop[pos[i]=ps]);         }         int cnt=0;         for(int j=0;j<n;j++){             if(pop[pos[j]]==ans)                 cnt++;         }         printf("%d\n",cnt);     }     return 0; }


 

原创粉丝点击