到天宮做客(洛谷P1178題題解,Java語言描述)

題目要求

題目鏈接

在這裏插入圖片描述

分析

早期代碼大概是這麼寫的,先是用了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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章