2016-11-26 39 views
-1

我從USACO培訓擠奶(USACO):錯誤的結果在很大程度上輸入測試用例

三個農民每天早晨和頭部上升5點的穀倉牛奶三頭奶牛做擠奶問題。第一個農民在時間300開始擠奶(在上午5點之後以秒計量)並且在時間1000結束。第二個農民在時間700開始並且在時間1200結束。第三個農民在時間1500開始並且在時間2100結束。至少有一個農民擠牛的最長連續時間是900秒(從300到1200)。在所有擠奶的開始和結束之間沒有進行擠奶的最長時間是300秒(1500減去1200)。

你的任務是編寫一個程序,將檢查開始 列表和結束時間爲N(1 < = N < = 5000)農民擠奶ñ奶牛和 計算(以秒爲單位):

的最長的時間間隔至少有一頭牛被擠奶。最長的時間間隔(擠奶開始後),在此期間沒有牛被擠奶。

我在一個TreeMap保存輸入後試圖直接的辦法,以便通過

i1 = tm.firstKey();// first key - tm is the treemap with values sorted by starting time 
    i2 = tm.get(tm.firstKey());// firstvalue 
     longest_conti = i2 - i1; 
     x=i2; 
// to find longest time interval at least one cow was milked. 
     for (Map.Entry<Integer, Integer> m : tm.entrySet()) { 

      i3 = m.getKey(); 
      i4 = m.getValue(); 
      t = i4 - i3; // a farmers time interval 
      if (t >= longest_conti)) 
      longest_conti = t; 
      if(i3>x) 
      { 
       i1=i3; 
       x=i4; 
      } 
       else 
       {longest_conti = longest_conti > (i4 - i1) ? longest_conti : (i4 - i1); 
       x=i4>x?i4:x; 
       } 


      System.out.println(longest_conti); 
     } 
// to find the longest time interval in which no cows were being milked 
     for (Map.Entry<Integer, Integer> m : tm.entrySet()) { 

      i3 = m.getKey(); 
      i4 = m.getValue(); 

      if (i3 > i2) { 
       longest_no = longest_no > (i3 - i2) ? longest_no : (i3 - i2); 
      } 
      if(i2<i4) 
      i2=i4; 

    } 

我收到了前7個測試用例正確的答案,但在8日的測試案例的開始時間排序有5000個輸入失敗(這也只是找到最長的時間間隔,這就是爲什麼我分開找到兩個時間間隔)。任何人都可以解釋我在哪裏犯錯誤(請在給出解決方案之前幫助我解釋代碼中的錯誤)。

+0

歡迎來到Stack Overflow!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然有問題,請隨時返回更多詳情。 –

+0

您發佈的代碼非常難以閱讀。如果你想獲得幫助,我建議正確格式化並給變量賦予更多有意義的名稱。 – kraskevich

+0

@kraskevich我做了一些修改......請再看一遍。其他人只是用來保存價值的臨時變量。 –

回答

0

如果您使用的是TreeMap,那麼在插入到TreeMap中之前檢查重複鍵,因爲TreeMap將默默地覆蓋先前的鍵值對。你的測試用例可能有重複的開始時間,你應該檢查結束時間(更具體地說是擠奶的時間間隔)並根據你的邏輯編寫。

+0

謝謝,,,像一個魅力工作。 –

相關問題