2019校招真题编程(七)牛牛的闹钟

题目描述

网易

牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要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)分。
数据保证至少有一个闹钟可以让牛牛及时到达教室
3
5 0
6 0
7 0
59
6 59

输出两个整数表示牛牛最晚起床时间。
6 0

我的思路

  1. 计算出最晚时间
  2. 将闹钟从晚到早排序
  3. 对比最晚时间,得出答案
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

pair<int, int> GetLastTime(int H, int M, int X)
{
    if(M>=X) return make_pair(H, M-X);
    int time = X-M;
    
    while(time>0)
    {
        H = H-1;
        M = abs(60-time);
        time = time-60;
    }

    return make_pair(H, M);
}

bool cmp(const pair<int, int>&a, const pair<int, int>&b)
{
    if(a.first!=b.first) return a.first>b.first;
    else return a.second>b.second;
}

int main()
{
    int n;
    cin>>n;
    vector<pair<int, int>>clocks;
    for(int i=0; i<n; i++)
    {
        pair<int, int>tmp;
        cin>>tmp.first>>tmp.second;
        clocks.push_back(tmp);
    }
    int x;
    cin>>x;
    int h,m;
    cin>>h>>m;
    sort(clocks.begin(), clocks.end(), cmp);
    pair<int, int>last = GetLastTime(h, m, x);
    pair<int, int>ans;
    
    for(int i=0; i<n; i++)
    {
        if(clocks[i].first>last.first) continue;
        if(clocks[i].second>last.second) continue;
        ans.first = clocks[i].first;
        ans.second = clocks[i].second;
        break;
    }
    cout<<ans.first<<" "<<ans.second<<endl;
    return 0;
}

答案错误:您提交的程序没有通过所有的测试用例
case通过率为80.00%

解题思路

把时间都转换为分钟计数,上课时间-路上时间得到最晚起床时间,把所有闹钟时间排序后,二分查找最晚起床时间。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool cmp(const int&a, const int&b)
{
    return a<b;
}

int main()
{
    int n;
    cin>>n;
    vector<int>clocks;
    for(int i=0; i<n; i++)
    {
        int hours,mins;
        cin>>hours>>mins;
        clocks.push_back(hours*60+mins);
    }
    int x;

    cin>>x;
    int h,m;

    cin>>h>>m;
    int time = h*60+m;
    sort(clocks.begin(), clocks.end(), cmp);
    
    int last = time - x;
    int ans;
    
    for(int i=0; i<n; i++)
    {
        if(clocks[i]<=last) ans=clocks[i];
        else break;
    }
    
    cout<<ans/60<<" "<<ans%60<<endl;
    
    return 0;   
}

运行时间:5ms

占用内存:508k

发布了68 篇原创文章 · 获赞 2 · 访问量 6162

猜你喜欢

转载自blog.csdn.net/qq_30050175/article/details/104116685