挤奶牛(USACO):大输入测​​试案例导致错误的结果

时间:2016-11-26 11:41:34

标签: java algorithm

我正在从USACO培训中解决挤奶奶牛的问题

  

每天早上5点,三名农民崛起,前往谷仓喂奶三头奶牛。第一位农民在时间300开始挤奶(在早上5点后以秒测量)并在时间1000结束。第二位农民在时间700开始并在时间1200结束。第三位农民在时间1500开始并在2100年结束。至少有一位农民挤奶的最长连续时间是900秒(从300到1200)。所有挤奶开始和结束之间没有挤奶的最长时间是300秒(1500减去1200)。

     

你的工作是写一个程序,检查一个开始列表   N(1 <= N <= 5000)农民挤奶N奶牛和奶牛的结束时间   计算(以秒为单位):

     

至少一头奶牛挤奶的最长时间间隔。最长的   时间间隔(挤奶开始后),在此期间没有奶牛   挤奶。

我在保存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个测试用例的正确答案,但第5个测试用例有5000个输入失败(这也只是找到最长的间隔,这就是为什么我分开找到两个间隔)。任何人都可以解释我在哪里犯错(请在提供解决方案之前帮我解释一下我的代码中的错误)。

1 个答案:

答案 0 :(得分:0)

如果您正在使用TreeMap,则在插入TreeMap之前检查重复键,因为TreeMap将静默覆盖以前的键值对。您的测试用例可能有重复的开始时间,您应该检查结束时间(更具体地说是挤奶的时间间隔),并根据写入您的逻辑。