JAVA - USACO无法解决 - 记录保持

时间:2014-12-13 06:06:51

标签: java algorithm

这是问题所在。

http://www.usaco.org/index.php?page=viewproblem2&cpid=358

我找不到解决问题的有效方法。我想按字母顺序组织每组奶牛,这样可以更容易比较。在那之后,我可以简单地找到模式。但是,我遇到的算法问题是,每次输入时呈现给我的奶牛群数量都不同。我打算将每组奶牛设置为一个字符串,但这显然不起作用,因为组的数量可能会有所不同。有什么想法可以更好地解决这个问题吗?

2 个答案:

答案 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();
    }
}