题意:意思是有若干个飞行员,需要在扫帚上练习飞行,每个飞行员具有不同的等级,且等级高的飞行员可以当等级低的飞行员的老师,且每个飞行员至多有且只有一个老师和学生。具有老师和学生关系的飞行员可以在同一把扫帚上练习,并且这个性质具有传递性。即比如有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
;
}

  分析:只要求出重复出现次数最多的数字出现的次数就好了

05-14 11:18