- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了 Usaco 训练门的挤奶时间问题(又名 milk2)。我的代码适用于前几个问题,但随后不适用于其中一种情况。
问题在这里:http://jeremiahflaga.blogspot.com/2011/09/milking-cows-programming-problem-from.html
不起作用的情况是: [1, 2] [3, 4] [5, 6] [7, 8] [9, 10] [11, 12] [13, 14] [15, 16] [17, 18] [19, 20] [1, 20]
我认为这是因为最后一个 [1, 20],它使我的代码无法工作,因为我认为我没有正确管理合并,但我已经尝试了一段时间并最终做出了代码更糟糕。
import java.io.*;import java.util.*;
public class milk2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("milk2in.txt"));
PrintWriter pw = new PrintWriter(new File("milk2.out"));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
String line = "";
int milkInterval = 0;
int largestMilkInterval = 0;
int noMilkInterval = 0;
int largestNoMilkInterval = 0;
milkingTime[] times = new milkingTime[N];
for (int i = 0; i < times.length; i++) {
st = new StringTokenizer(br.readLine());
milkingTime mt = new milkingTime(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
times[i] = mt;
}
System.out.println(Arrays.toString(times));
for (int i = 0; i < times.length - 1; i++) {
noMilkInterval = 0;
if (times[i].getEnd() >= times[i + 1].getStart()) {
if (times[i].getStart() > times[i + 1].getStart()) {
milkInterval += times[i + 1].getEnd() - times[i + 1].getStart();
} else {
milkInterval += (times[i].getEnd() - times[i].getStart()) + (times[i + 1].getEnd() - times[i + 1].getStart());
}
System.out.println("Milk Interval: " + milkInterval);
} else {
milkInterval += (times[i].getEnd() - times[i].getStart());
if (milkInterval > largestMilkInterval) {
largestMilkInterval = milkInterval;
}
milkInterval = 0;
noMilkInterval += times[i + 1].getStart() - times[i].getEnd();
System.out.println("No milk interval: " + noMilkInterval);
}
if (noMilkInterval > largestNoMilkInterval) {
largestNoMilkInterval = noMilkInterval;
}
if (milkInterval > largestMilkInterval) {
largestMilkInterval = milkInterval;
}
}
if (times.length == 1) {
largestMilkInterval = times[0].getEnd() - times[0].getStart();
largestNoMilkInterval = 0;
}
System.out.println("Largest Milk Interval: " + largestMilkInterval);
System.out.println("Largest no milk Interval: " + largestNoMilkInterval);
// pw.println(largestMilkInterval + " " + largestNoMilkInterval);
// pw.close();
}
}
class milkingTime {
private int start;
private int end;
public milkingTime(int s, int e) {
start = s;
end = e;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
public String toString() {
return "Start: " + start + " End: " + end;
}
}
我也想知道我的代码是否完全错误,这不是解决这个问题的正确方向。
最佳答案
您的解决方案似乎是错误的。
主要错误是您显然做出的一个假设,您可以在一次遍历表格中找到给定间隔之间的所有重要相关性。遗憾的是,问题表述不能保证间隔按任何特定顺序给出。它甚至特别提到有几个“农民”在挤奶——因此,即使每个计划都是有序的,他们各自的计划在连接时可能会导致总输入无序。这是示例数据中的一种情况,其中包含十个间隔的有序运行
[1, 2] [3, 4] ... [19, 20]
然后再进行一次单间隔运行
[1. 20]
其中涵盖了前者。
为了解决这个问题,我建议按间隔的开始时间对数据进行排序:
[1, 2] [1, 20] [3, 4] ... [19, 20]
每两个具有相同开始时间的间隔重叠,现在它们位于数组的连续 block 中,因此我们可以轻松找到它们。此外,当且仅当第 i
个间隔与第 k
个间隔同时结束或晚于第 i
个间隔开始时,第 k
个间隔与其他一些间隔重叠(其中 i
小于 k
)。
这就是我合并它们的方式:
int curr = 0; // the interval to receive a merge
int next = 1; // the interval to be possibly merged into current
while (next < N)
{
if (times[curr].getEnd() >= times[next].getStart()) // overlapping?
{
times[curr].expandTo( times[next].getEnd() ); // merge to the current
}
else
{
++ curr; // finished merging to current
if (curr != next) // some items got merged
times[curr] = times[next]; // shift further items to emptied space
}
++ next;
}
newN = curr + 1; // number of separate intervals after all merges
由于之前的排序,我们知道第 k
个间隔不能在第 i
个 if i<k
之前开始,因此单个条件可靠地指示所有重叠。
当然,expandTo
类中的milkingTime
方法必须增加结束时间以覆盖给定值:
class milkingTime {
.....
public void expandTo(int targetTime)
{
if (getEnd() < targetTime) {
setEnd(targetTime);
}
}
}
现在找到最长间隔和最长间隙就很简单了:
int longestInterval = 0;
for (int i = 0; i < newN; ++ i) {
if (times[i].getLength() > longestInterval)
longestInterval = times[i].getLength();
}
int longestGap = 0;
for (int i = 1; i < newN; ++ i) {
int gap = times[i].getStart() - times[i - 1].getEnd();
if (gap > longestGap)
longestGap = gap;
}
关于java - USACO 训练挤奶时间(最长非挤奶时间) - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62408149/
问题如下 考虑下面显示的数字三角形。编写一个程序,计算从顶部开始到底部某处结束的路线上可以传递的最大数字总和。每一步都可以向左斜向下或向右斜向下。 7 3 8
我正在 USACO 计算机奥林匹克竞赛中尝试代码,但遇到了第一个问题。如果我提交以下代码,则会收到以下错误: Run 1: Execution error: Your program exited w
我正在使用eclipse来编写程序。当我尝试提交程序时,USACO 给我一个文件丢失的信息: 示例输入案例超出运行时错误或内存限制 - 详细信息如下您的输出文件 reorder.out:[文件丢失!]
我在解决 USACO 培训页面上的第一个问题时遇到了麻烦。 任务是从 text.in 文件中请求两个字符串,将字符串转换为字母乘积的数字(其中 a=1、b=2、z=26),然后查看余数是否的数字/47
section2.2中的“子集和”问题要求你计算从1到n的整数集合有多少种方式可以分成两个和相同的集合。 我知道重现是: f[i][j] : numbers of ways that sum up t
我是编码新手,我正在尝试为 USACO 发布的“十三号星期五”问题编写代码,该问题要求我们计算每月 13 日出现在星期日、星期一、星期二、星期三的频率,指定 N 年期间的星期四、星期五和星期六。测试的
我正在为 USACO 编写代码,但文件的读写不起作用。我正在尝试读取第一个文件行并将其存储为整数。后续行将被读取并存储到数组中以执行计算。我认为这个问题与 fopen 有关。我总是收到中止窗口,上面写
问题如下 考虑下面显示的数字三角形。编写一个程序,计算从顶部开始到底部某处结束的路线上可以传递的最大数字总和。每一步都可以向左斜向下或向右斜向下。 7 3 8 8 1
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我是计算机科学专业的一年级学生,目前正在参加一些算法竞赛。我编写的以下代码存在一个缺陷,我不确定如何修复 这是问题说明: http://www.usaco.org/index.php?page=vie
我刚刚开始使用 Java 解决一些 USACO 实践问题。然而,我立即遇到了一些关于解析文件输入的困惑...... USACO 培训页面说: Important: BufferedReader and
我遇到了 Usaco 训练门的挤奶时间问题(又名 milk2)。我的代码适用于前几个问题,但随后不适用于其中一种情况。 问题在这里:http://jeremiahflaga.blogspot.com/
我遇到了 USACO 培训页面上的第一个问题。 任务是从 text.in 文件中请求两个字符串,将字符串转换为字母乘积的数字(其中 a=1、b=2、z=26),然后查看如果数字/47 的余数彼此相等(
This是我正在研究的问题 我没有收到任何编译时错误、运行时错误,而且我的大部分代码似乎都可以正常工作。调试后,我发现 left() 和 right() 中的 while 循环导致了问题。我很难弄清楚
我一直在看一些USACO黄金级别的算法问题,我需要有人帮我解释一下这个问题的解决方案。 Here是问题所在,解决方案如下: Usually the first step in solving incr
我对 C++ 还很陌生,去年一直在尝试 USACO 问题。这是我下面的代码,它可以工作,但是花了几个小时来摆弄格式。事实证明我需要 bool sorting(total a, total b) {re
我收到一条错误消息,提示我的文件作为标准问题丢失。我已经关闭了刷新 FileReader 的文件,使问题变得更加模糊。我尝试使用 BufferedWriter、FileOutputStream 和 D
我正在处理 USACO 培训页面的第一个问题,它要求您提交一个简单的解决方案。虽然我的代码可以在 IDE 上编译,但 USACO 评分器给我一个错误,说找不到 main。 Run 1: Executi
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
2018 年 12 月的 USACO 铜牌问题,BackForth 问题:http://usaco.org/index.php?page=viewproblem2&cpid=857 我的代码: imp
我是一名优秀的程序员,十分优秀!