#P1340. 第2题-闹钟
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 163
            Accepted: 79
            Difficulty: 4
            
          
          
          
                       所属公司 : 
                              科大讯飞
                                
            
                        
              时间 :2023年7月1日
                              
                      
          
 
- 
                        算法标签>排序算法          
 
第2题-闹钟
思路:排序
我们首先将计算出每个闹钟响铃的时间hour×60+mintue,然后对所有闹钟按照时间的大小升序排列
然后我们遍历排序后的闹钟序列,根据当前时间找到下一个响的闹钟即可。
当然也可以不排序,直接遍历,然后更新最小值也可以。
时间复杂度
O(nlogn)
c++代码
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
struct Node {
   int time;
   string clock;
};
int strToInt(string& str) {
   int h = (str[0] - '0') * 10 + (str[1] - '0');
   int min = (str[3] - '0') * 10 + (str[4] - '0');
   return h * 60 + min;
}
int main() {
   int curt = 0;
   string str; cin >> str;
   curt = strToInt(str);
   int n; cin >> n;
   vector<Node> nums(n);
   for(int i = 0; i < n; i++) {
      cin >> nums[i].clock;
      nums[i].time = strToInt(nums[i].clock);
   }
   sort(nums.begin(), nums.end(), [&] (const Node& A, const Node& B) {
      return A.time < B.time;
   });
   string ans;
   for(auto x : nums) {
      if(x.time > curt) {
         ans = x.clock;
         break;
      }
   }
   cout << ans;
   return 0;
}
python代码
import sys
from bisect import bisect_left
input = sys.stdin.readline
def get_minutes(s):
    hours, minutes = [int(x) for x in s.split(':')]
    return hours * 60 + minutes
cur = get_minutes(input())
data = []
n = int(input())
for _ in range(n):
    s = input()
    data.append((get_minutes(s), s))
data.sort()
i = bisect_left(data, (cur + 1, ))
print(data[i][-1])
Java代码
import java.util.Scanner;
public class Main {
    public static int Tim; // 时间变量
    public static int n; // 时间段数量
    public static int ans = 1440; // 初始化最小时间差为一天的分钟数(24小时 * 60分钟)
    public static char[] s = new char[10]; // 输入字符串
    public static char[] out = new char[10]; // 输出字符串
    public static int get() {
        int number = 0, tmp = 0;
        for (int i = 1; i <= 5; ++i) {
            if (s[i] >= '0' && s[i] <= '9') {
                number = number * 10 + s[i] - '0';
            } else if (s[i] == ':') {
                tmp = number * 60; // 将小时转换为分钟
                number = 0;
            }
        }
        return tmp + number; // 返回总分钟数
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.next();
        for (int i = 0; i < input.length(); i++) {
            s[i + 1] = input.charAt(i);
        }
        Tim = get(); // 获取当前时间的分钟数
        n = scanner.nextInt(); // 读取时间段数量
        for (int i = 1, tmp; i <= n; ++i) {
            input = scanner.next(); // 读取时间段的起始时间
            for (int j = 0; j < input.length(); j++) {
                s[j + 1] = input.charAt(j);
            }
            tmp = get(); // 获取时间段起始时间的分钟数
            if (tmp > Tim && tmp - Tim < ans) { // 如果时间段起始时间在当前时间之后且时间差更小
                ans = tmp - Tim; // 更新最小时间差
                for (int j = 1; j <= 5; ++j) {
                    out[j] = s[j]; // 更新最小时间差对应的时间段起始时间
                }
            }
        }
        for (int i = 1; i <= 5; ++i) {
            System.out.print(out[i]); // 输出最小时间差对应的时间段起始时间
        }
    }
}
        题目描述
小红每天都要早起,为了预防自己没有及时醒来,小红定了许多个闹钟(且闹钟每天都会响)。
这天小红醒了以后看了一眼当前的时间,为了防止自己被后面响的铃声吓一跳,他想知道下一次闹钟响是什么时候?
输入描述
输入第一行,按 XX:XX 的格式输入两个数字表示当前的时间。
第二行输入一个正整数 n ,代表小红定的闹钟数量。(1≤n≤100)
接下来的n行,每行按 XX:XX 的格式输入两个数字表示定下的闹钟时间。
对于所有1≤n≤100,所有的时间保证是 XX:XX 的形式,且一定在 00:00 到 23:59 之间。数据保证同一天内一定有一个还没响的闹钟。
输出描述
按 XX:XX 格式表示的时间,代表下一次闹种响的时间。
样例1
样例输入
12:00
3
06:00
13:00
23:59
样例输出
13:00
样例2
样例输入
07:40
5
06:00
07:00
14:30
08:00
15:00
样例输出
08:00
            Related
In following contests: