[usaco2013nov_bronze]records
描述 Description
Records
Farmer John对他的每一头进入谷仓产奶的奶牛都有详细的记录,每小时有一组牛进入,每组有三头牛。Farmer John会记下他们的名字。比如说:经过五小时,他可能会写下下列名单,每一行对应一组进入谷仓的奶牛:
BESSIE ELSIE MATILDA
FRAN BESSIE INGRID
BESSIE ELSIE MATILDA
MATILDA INGRID FRAN
ELSIE BESSIE MATILDA
每一组牛都可能在Farmer John的名单上出现多次,比如:BESSIE , ELSIE , MATILDA出现了三次(Farmer John没必要每次都按相同的顺序记录他们的名字)。
请帮助Farmer John统计出那组牛进入谷仓的次数最多。
输入格式 Input Format
第一行:一个数字N,代表已经记录几个小时;(1 <= N <= 1000)
第2…1+N 行每行有三个奶牛的名字,分别用空格隔开。每一个名字不超过10个字母,而且字母都在A…Z之间。
输出格式 Output Format
一行,输出进入谷仓最多的次数
样例输入 Sample Input
5
BESSIE ELSIE MATILDA
FRAN BESSIE INGRID
BESSIE ELSIE MATILDA
MATILDA INGRID FRAN
ELSIE BESSIE MATILDA
样例输出 Sample Output
3
时间限制 Time Limitation
1s
注释 Hint
这组{BESSIE, ELSIE, MATILDA} 进入最多
来源 Source
usaco 2013 dec bronze
本题翻译来自2015届李强
啊,这道题看着范围就很水,hash一下存数组里n2n^2n2比较得出答案就行,我们考虑到一个名字可能会出现在不同的奶牛组里,我们将一组奶牛hash存到一个竖直长度只有3的二维数组中,每次存完排一下序,这样保证在 比较的时候能一一对应
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, a[1010][3];
ll hash(char c[]){
int k = strlen(c);
ll r = 0;
for(int i = 0; i < k; ++i){
r = r * 10 + c[i] - 'A';
}
return r;
}
char c1[15], c2[15], c3[15];
int main()
{
scanf("%lld", &n);
for(int i = 1; i <= n; ++i){
scanf("%s%s%s", c1, c2, c3);
a[i][0] = hash(c1);
a[i][1] = hash(c2);
a[i][2] = hash(c3);
sort(a[i], a[i] + 3);
}
int ans = 0;
for(int i = 1; i <= n; ++i){
int num = 0;
for(int j = 1; j <= n; ++j){
if(a[i][0] == a[j][0] && a[i][1] == a[j][1] && a[i][2] == a[j][2])
++num;
ans = max(ans, num);
}
}
printf("%d\n", ans);
return 0;
}