这是问题所在。
http://www.usaco.org/index.php?page=viewproblem2&cpid=358
我找不到解决问题的有效方法。我想按字母顺序组织每组奶牛,这样可以更容易比较。在那之后,我可以简单地找到模式。但是,我遇到的算法问题是,每次输入时呈现给我的奶牛群数量都不同。我打算将每组奶牛设置为一个字符串,但这显然不起作用,因为组的数量可能会有所不同。有什么想法可以更好地解决这个问题吗?
答案 0 :(得分:0)
你正朝着正确的方向前进。仍然可以更进一步 - 按字母顺序对每个组进行排序后,按字典顺序对所有组进行排序。我们举个例子:
BESSIE ELSIE MATILDA
FRAN BESSIE INGRID
BESSIE ELSIE MATILDA
MATILDA INGRID FRAN
ELSIE BESSIE MATILDA
在第一步之后你已经建议这些将成为:
BESSIE ELSIE MATILDA
BESSIE FRAN INGRID
BESSIE ELSIE MATILDA
FRAN INGRID MATILDA
BESSIE ELSIE MATILDA
然后对整个群体进行排序:
BESSIE ELSIE MATILDA
BESSIE ELSIE MATILDA
BESSIE ELSIE MATILDA
BESSIE FRAN INGRID
FRAN INGRID MATILDA
第二步可以通过考虑用于表示组的整个字符串来完成。在这个排序之后,问题可以通过一个线性传递来完成(我将这留给你来计算)。
我建议的方法会起作用,因为输入相对较小,因此解决方案不会太慢。对于更大的约束,您应该使用散列执行第二步(在对每个组中的名称进行排序之后)。您也可以将此方法应用于您的问题,但它有点复杂。
答案 1 :(得分:0)
这是我对这个问题的回答,我希望它有所帮助,这是我在比赛中想到的最好的解决方案,它通过了所有的测试用例。
import java.io.*;
import java.util.*;
public class records {
public static void main(String[] args)throws IOException {
BufferedReader bf = new BufferedReader(new FileReader("records.in"));
PrintWriter pw = new PrintWriter(new File("records.out"));
int n = Integer.parseInt(bf.readLine());
Map<String, Integer> map = new HashMap<String, Integer>();
for(int i = 1; i<=n ;i++){
String str = bf.readLine();
char[] chars = str.toCharArray();
Arrays.sort(chars);
String sorted = new String(chars);
if(map.containsKey(sorted)){
int count = map.get(sorted);
map.put(sorted, count + 1);
}else{
map.put(sorted, 1);
}
}
/*for (String name : map.keySet()) {
System.out.println(name + ": " + map.get(name));
}*/
List<Integer> c = new ArrayList<Integer>(map.values());
Collections.sort(c);
pw.println(c.get(c.size() -1));
pw.close();
}
}