牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要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
输出例子1:
6 0
【题目分析】:本题最重要的是不要把问题复杂化,昨天晚上做题的时候总是想的是小时是不是要转化为分钟,再去映射到原来的时分,但是问题就这样被复杂化了,这个问题其实只要保证每个闹钟加上路上的时间,与到校时间最接近的就是需要的结果输出便可以了。其中有一个技巧就是利用除法/取整,%取余。再利用||,&&两个符号,这题目自然迎刃而解了。这道题还总结了一个教训,一定要学会利用cin,cout和scanf,printf这样技巧也是会多次出现的,比如定义一个数字 int h[100],m[100],在其中输入几组时分,就是for(int i=0;i<N;i++)scanf("%d %d",&h[i],&m[i]);一句话就解决问题了。
#include<bits/stdc++.h>
using namespace std;
int h[105],m[105];
int main(){
int N;
scanf("%d",&N);
for(int i=0;i<N;i++)scanf("%d %d",&h[i],&m[i]);
int GoSchoolTime;
scanf("%d",&GoSchoolTime);
int atSchoolHour,atSchoolMin;
scanf("%d%d",&atSchoolHour,&atSchoolMin);
int ans1=0,ans2=0,temp1,temp2;
for(int i=0;i<N;i++){
temp2=m[i]+GoSchoolTime;
temp1=h[i]+temp2/60;
temp2=temp2%60;
if(temp1<atSchoolHour||temp1==atSchoolHour&&temp2<=atSchoolMin){//限制到时间是小于上课时间的
if(h[i]>ans1||(h[i]==ans1&&m[i]>ans2)){//找最接近的闹钟时间
ans1=h[i];
ans2=m[i];
}
}
}
printf("%d %d\n",ans1,ans2);
return 0;
}