这就是问题[黑客等级挑战 - 洗板]:https://www.hackerrank.com/contests/101hack41/challenges/washing-plates
错误:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Plates.main(Plates.java:17)
代码。
import java.util.*;
public class Plates {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//System.out.println("Enter Details");
String s = in.next();
int l = s.length();
int n = s.charAt(0);
int k = s.charAt(l - 1);
int arr[][] = new int[n][2];
for(int i = 0; i < n; i++) {
for(int j = 0; j < 2; j++) {
arr[i][j] = in.nextInt();
}
}
int max = 0;
int inc[] = new int[n];
int ded[] = new int[n];
for(int t = 0; t < n; t++) {
for(int p = 0; p < 2; p++) {
if(p == 0) {
inc[t] = arr[t][p];
} else if(p == 1) {
ded[t] = arr[t][p];
}
}
}
int a, b;
int sum = 0, loss = 0;
for(a = 0; a < n; a++) {
for(b = 1; b <= k; b++) {
sum = sum + inc[a + 1];
loss = loss - ded[a + 1];
}
if((sum - loss) > max) {
max = sum - loss;
}
}
System.out.println(max);
}
}
答案 0 :(得分:5)
HackerRank说:
第一行包含两个以空格分隔的整数,用于描述
SELECT dt , WeekCommencing , [Week] , WeekofMonth , [DayofWeek] , [MonthName] , [year] , [Site] , Team , SubTeam , Client , Scheme , Calls_Offered , Calls_Answered FROM [LB ODS].WorkCalendarV2Emails WHERE (Site IN (@Site)) AND (Data_Label IN (@DataLabel)) AND (dt >= @startdate) AND (dt <= @enddate) ORDER BY dt
(脏板数)和n
的相应值(Harold有时间的板数)洗。)
- 1&lt; =
k
&lt; = 20000,1&lt; =n
&lt; = 20000
但是,您的代码正在做一些完全不同的事情:
k
由于next()
只读取一个令牌,String s = in.next();
int l = s.length();
int n = s.charAt(0);
int k = s.charAt(l - 1);
将是HackerRank值s
的字符串值。
让我们说第一行是:
n
您的代码会将7000 20000
读为7000
,然后分配s
和n = '7'
。
字符k = '0'
具有ASCII / Unicode数值'7'
,字符55
具有值'0'
。所以你真正得到的是48
和n = 55
。
你应该做的,就是这样:
k = 48
<强>更新强>
比赛结束后,您可以阅读editorial page以查看解决方案。 Java没有multiset
(有序列表),但您可以使用PriorityQueue
。
下面是一个替代解决方案,内存占用较低,适用于int n = in.nextInt();
int k = in.nextInt();
的高值。
首先,假设您可以清洗所有板块,因此总结所有k
值。如果p
,您就完成了。现在,对于您无法清洗的每个印版,再次减去k >= n
并减去p
,例如从总数中减去d
。
然后目标是首先清洗具有最高p + d
值的板,因此我们将从总数中减去较小的值。为此,请构建一个p + d
值数组,对其进行排序,然后清洗/删除/跳过具有最高值的p + d
版块。
最后,记住不要返回负值。
这里是紧凑的形式:
k
答案 1 :(得分:0)
最好使用out.size() == sizeof(int)
函数读取完整行作为输入:
nextLine
然后根据空格分割字符串。