Gridland Metro HackerRank
Gridland Metro HackerRank
我在 hackerRank 上解决了这个 question。我已经完成了整个讨论部分,尝试了所有建议的测试用例并取得了预期的结果。我想我可能犯了一些愚蠢的代码错误,因为我确定我已经 thought/considered 实现了每个场景。如果我的代码有任何错误,你能帮我指出吗?
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String strNum[] = bf.readLine().split("\s");
double n = Double.parseDouble(strNum[0]);
double m = Double.parseDouble(strNum[1]);
double k = Double.parseDouble(strNum[2]);
Map<Double, TreeMap<Double, Double>> map = new HashMap<>();
while (k > 0) {
strNum = bf.readLine().split("\s");
double r = Double.parseDouble(strNum[0]);
double c1 = Double.parseDouble(strNum[1]);
double c2 = Double.parseDouble(strNum[2]);
TreeMap<Double, Double> innerMap = map.get(r);
if (innerMap != null) {
Double x = innerMap.get(c1);
if (x != null) {
if (c2 > x) {
innerMap.put(c1, c2);
}
} else {
innerMap.put(c1, c2);
}
} else {
innerMap = new TreeMap<Double, Double>();
innerMap.put(c1, c2);
map.put(r, innerMap);
}
k--;
}
double count = (n - map.size()) * m;
for (Map.Entry<Double, TreeMap<Double, Double>> e : map.entrySet()) {
TreeMap<Double, Double> innerMap = e.getValue();
double start = innerMap.firstKey();
double end = innerMap.firstEntry().getValue();
for (Map.Entry<Double, Double> e2 : innerMap.entrySet()) {
double x = e2.getKey();
double y = e2.getValue();
if (y > end) {
if (x > end) {
count += ((x - end) - 1);
}
end = y;
}
}
count += (m - (end - start + 1));
}
System.out.println(String.format("%.0f", count));
}
24/31 测试用例失败。非常感谢任何帮助。
如果您的代码读取 r,c1,c2
后跟 r,c1,c2'
和 c2'<c2
,它会默默地删除前一首曲目。
@fpezzini 有一个关于双打的观点:关于输入
1000000000 1000000000 1
1 1 1
您的代码打印 1000000000000000000
,而不是 999999999999999999
,因为后者不能表示为双精度数。
我在 hackerRank 上解决了这个 question。我已经完成了整个讨论部分,尝试了所有建议的测试用例并取得了预期的结果。我想我可能犯了一些愚蠢的代码错误,因为我确定我已经 thought/considered 实现了每个场景。如果我的代码有任何错误,你能帮我指出吗?
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String strNum[] = bf.readLine().split("\s");
double n = Double.parseDouble(strNum[0]);
double m = Double.parseDouble(strNum[1]);
double k = Double.parseDouble(strNum[2]);
Map<Double, TreeMap<Double, Double>> map = new HashMap<>();
while (k > 0) {
strNum = bf.readLine().split("\s");
double r = Double.parseDouble(strNum[0]);
double c1 = Double.parseDouble(strNum[1]);
double c2 = Double.parseDouble(strNum[2]);
TreeMap<Double, Double> innerMap = map.get(r);
if (innerMap != null) {
Double x = innerMap.get(c1);
if (x != null) {
if (c2 > x) {
innerMap.put(c1, c2);
}
} else {
innerMap.put(c1, c2);
}
} else {
innerMap = new TreeMap<Double, Double>();
innerMap.put(c1, c2);
map.put(r, innerMap);
}
k--;
}
double count = (n - map.size()) * m;
for (Map.Entry<Double, TreeMap<Double, Double>> e : map.entrySet()) {
TreeMap<Double, Double> innerMap = e.getValue();
double start = innerMap.firstKey();
double end = innerMap.firstEntry().getValue();
for (Map.Entry<Double, Double> e2 : innerMap.entrySet()) {
double x = e2.getKey();
double y = e2.getValue();
if (y > end) {
if (x > end) {
count += ((x - end) - 1);
}
end = y;
}
}
count += (m - (end - start + 1));
}
System.out.println(String.format("%.0f", count));
}
24/31 测试用例失败。非常感谢任何帮助。
如果您的代码读取 r,c1,c2
后跟 r,c1,c2'
和 c2'<c2
,它会默默地删除前一首曲目。
@fpezzini 有一个关于双打的观点:关于输入
1000000000 1000000000 1
1 1 1
您的代码打印 1000000000000000000
,而不是 999999999999999999
,因为后者不能表示为双精度数。