我正在从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个输入失败(这也只是找到最长的间隔,这就是为什么我分开找到两个间隔)。任何人都可以解释我在哪里犯错(请在提供解决方案之前帮我解释一下我的代码中的错误)。
答案 0 :(得分:0)
如果您正在使用TreeMap,则在插入TreeMap之前检查重复键,因为TreeMap将静默覆盖以前的键值对。您的测试用例可能有重复的开始时间,您应该检查结束时间(更具体地说是挤奶的时间间隔),并根据写入您的逻辑。