题意:意思是有若干个飞行员,需要在扫帚上练习飞行,每个飞行员具有不同的等级,且等级高的飞行员可以当等级低的飞行员的老师,且每个飞行员至多有且只有一个老师和学生。具有老师和学生关系的飞行员可以在同一把扫帚上练习,并且这个性质具有传递性。即比如有A,B,C,D,E五个飞行员,且等级是A>B>C>D>E,那么可以使A当B的老师,B当C的老师,E当D的老师,那么A,B,C可以在同一扫帚上练习,D,E在同一把扫帚上练习,这样需要2把扫帚,而如果是A当B的老师,B当C的老师,C当D的老师,D当E的老师,那么只需要一把扫帚。题目所求即所需最少的扫帚数目。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf =0x7f7f7f7f;
const double pi=acos(-);
const int maxn=+;
char s[];
int Hash[];
int BKDRHash(char* s)
{
long long seed=;
long long hashv=;
while(*s=='0')s++;
while(*s)
{
hashv=hashv*seed+(*s++);
}
return (hashv & 0x7FFFFFFF);
} int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)
{
scanf("%s",s);
Hash[i]=BKDRHash(s);
}
sort(Hash+,Hash+n+);
int ans=,tmp=;
for(int i=;i<=n;i++)
{
if(Hash[i]==Hash[i-]) tmp++;
else tmp=;
ans=max(ans,tmp);
}
printf("%d\n",ans);
}
return;
}
分析:只要求出重复出现次数最多的数字出现的次数就好了