题目描述
牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要X分钟到达教室,上课时间为当天的A时B分,请问他最晚可以什么时间起床
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示闹钟的数量N(N<=100)。
接下来的N行每行包含两个整数,表示这个闹钟响起的时间为Hi(0<=A<24)时Mi(0<=B<60)分。
接下来的一行包含一个整数,表示从起床算起他需要X(0<=X<=100)分钟到达教室。
接下来的一行包含两个整数,表示上课时间为A(0<=A<24)时B(0<=B<60)分。
数据保证至少有一个闹钟可以让牛牛及时到达教室。
输出描述:
输出两个整数表示牛牛最晚起床时间。
示例1
输入
3
5 0
6 0
7 0
59
6 59
输出
6 0
运行时间:93ms 占用内存:10900k
话说这道题是2019/8/11那天的今日头条笔试的第一道题,而且是原题!!!但是我之前没在牛客网上刷过题,话说牛客的输入输出搞得是真差,就不能学学leetcode(之前一直在leetcode上刷题)。考试那天第一次接触牛客网,心里是炸的,因为时间全浪费在这上面了,好多题没有做。所以,大家一定要在牛客上多刷题。
好了言归正传,首先这道问题我我想到的就是贪心算法(我一直认为输入的闹钟是有序的,所以没排序就做了,但是后来发现这个闹钟时间不是按照时间大小排好序的,所以一定要先排序,考试就错在这个地方了,过了30%)。而且题干给的是小时和分钟,这样不好排序,那就将小时转换为分钟即,(小时*60+分钟)。然后排序,倒序比较(因为最大的时间在最后,只要找到一个合适的输出即可)。
import java.util.Scanner;
import java.util.Arrays;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int times[] = new int[n];
for(int i=0;i<n;i++){
int hours = sc.nextInt();
int mins = sc.nextInt();
times[i] = hours*60+mins;
}
Arrays.sort(times);
int x = sc.nextInt();
int a = sc.nextInt();
int b = sc.nextInt();
int endTime = a*60+b;
for(int i=n-1;i>=0;i--){
if(times[i]+x<=endTime){
System.out.println(times[i]/60+" "+times[i]%60);
break;
}
}
}
sc.close();
}
}