題目要求
分析
早期代碼大概是這麼寫的,先是用了Date,結果連樣例都過不去,就換了日期數組自己做,還是不對。
import java.util.*;
public class Main {
public static void main(String[] args) {
Set<Long> time_set = new TreeSet<>();
int[] month_list = {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
time_set.add(0L);
time_set.add(366L*24*3600);
for (int i = 0; i < num; i++) {
int temp = month_list[scanner.nextInt()]+scanner.nextInt();
time_set.add((temp)*24L*3600);
System.out.println(temp);
// time_set.add(new Date(4000, scanner.nextInt()-1, scanner.nextInt()).getTime()/1000);
}
scanner.close();
Iterator<Long> iterator = time_set.iterator();
long prev = iterator.next(), max_time_slot = 0;
while (iterator.hasNext()) {
long temp = iterator.next();
max_time_slot = Math.max(max_time_slot, temp-prev);
prev = temp;
}
System.out.printf("%.0f", max_time_slot*1.0/366);
}
}
後面發現問題主要是在兩個日子相減的時候應該額外減一,而如果是在已經乘上時分秒之後減一其實是減了一秒,就會錯。
所以應該把Set裏的時間改成int,最後乘以時分秒。
特別強調:最後的運算一定不要直接整數運算或是截斷取整,一定要使用浮點運算,四捨五入:System.out.printf("%.0f", max_time_slot243600/366.0);
提供兩組測試數據:
測試數據3
in
0
out
86400
測試數據4
in
1
7 1
out
43200
AC代碼(Java語言描述)
import java.util.*;
public class Main {
public static void main(String[] args) {
Set<Integer> time_set = new TreeSet<>();
int[] month_list = {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
time_set.add(1);
time_set.add(367);
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
for (int i = 0; i < num; i++) {
time_set.add(month_list[scanner.nextInt()]+scanner.nextInt());
}
scanner.close();
if (num == 0) {
System.out.println("86400");
return;
}
Iterator<Integer> iterator = time_set.iterator();
long prev = iterator.next(), max_time_slot = 0;
while (iterator.hasNext()) {
long temp = iterator.next();
max_time_slot = Math.max(max_time_slot, temp-prev-1);
prev = temp;
}
System.out.printf("%.0f", max_time_slot*24*3600/366.0);
}
}