2018年网易计算机视觉实习生笔试编程题

牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要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;
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值