网易校招题之牛牛的闹钟
题目描述
牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要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
注意题目说的上课时间是当天的,所以闹钟为23:00 1:00 2:00 上课时间为00:10 是不成立的
先把时和分全部转换成分,牛牛上课的时间减去他起床算起到教室花费的时间就是他应该起床的时间,我们设为time,time再减去闹铃的时间如果是大于等于0说明来得及,如果是小于0,说明牛牛要迟到了,因此我们要找的最晚起床的点就是time减去闹铃的时间大于等于0和小于0的分界点,当然还有一种情况就是time减去牛牛设的每一个闹钟全部都是大于等于0,那就取最晚设置的那个闹钟点。
#include<bits/stdc++.h> using namespace std; vector<int>V; int main() { int n; cin >>n; int Hi,Mi; //输入闹钟时间点,全部转换为分 for(int i = 0;i<n;i++) { cin >>Hi>>Mi; V.push_back(Hi*60+Mi); } int x; cin >>x; int A,B; cin >>A>>B; sort(V.begin(),V.end()); int time = A*60+B-x; //如果所有闹钟叫醒牛牛都不会迟到,就输出最后一个 if((time-V[n-1])>=0) { cout<<V[n-1]/60<<" "; cout<<V[n-1]%60; } //找出大于等于0与小于0的分界点 for(int i = 1;i<n;i++) { if(time-V[i-1]>=0 && time-V[i]<0) { cout<<V[i-1]/60<<" "; cout<<V[i-1]%60; } } return 0; }