2014-12-13 115 views
0

以下是問題所在。JAVA - USACO無法解決 - 記錄保存

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

我無法找到解決問題的有效途徑。我想按字母順序組織每組奶牛,這會使它們更容易比較。之後,我可以簡單地找到模式。但是,我遇到的算法問題是,呈現給我的奶牛羣在每個輸入中的數量都不相同。我打算將每組奶牛設置爲一個字符串,但這顯然不起作用,因爲組數可能會有所不同。有沒有更好的方法來解決這個問題?

回答

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 

第二步可以通過考慮用於表示組的整個字符串來完成。排序完成後,問題可以通過一次線性傳遞完成(我將這個傳遞給你)。

我建議的方法將工作,因爲輸入相對較小,因此解決方案不會太慢。對於更大的約束條件,您應該使用哈希來完成第二步(在對每個組中的名稱進行排序後)。您也可以將這種方法應用於您的問題,但它有點複雜。

+0

感謝您的回答!但是,對於「考慮用於表示組的整個字符串」的含義,我有點困惑。你的意思是說我會把每一組奶牛存儲到一個字符串中嗎? – Vonais 2014-12-14 02:05:40

+0

這種方法可以實現排序,但是您不能*使用它。我不確定是否可以在Java中對一些數組進行排序,但基本上這就是你需要做的。 – 2014-12-14 06:04:13

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