题目描述
网易
牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要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
我的思路
- 计算出最晚时间
- 将闹钟从晚到早排序
- 对比最晚时间,得出答案
#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