每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示闹钟的数量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> using namespace std; int main() { int N, hi, mi, x, goclass; int res = 0; cin >> N; int getup[N]; for (int i = 0; i < N; i++) { cin >> hi >> mi; getup[i] = hi * 60 + mi; } cin >> x >> hi >> mi; goclass = hi * 60 + mi; for (int i = 0; i < N; i++) { if (getup[i] + x <= goclass && getup[i] > res) res = getup[i]; } cout << res / 60 << ' ' << res % 60; return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int hh = 0 , mm = 0; int [] a = new int[N]; for (int i = 0; i < N; i++) { hh = in.nextInt(); mm = in.nextInt(); a[i] =( hh * 60 ) + mm; } int lushi = in.nextInt(); int ScHH = in.nextInt(); int ScMM = in.nextInt(); int School = (ScHH * 60) + ScMM; int min = 0; for (int i = 0; i < a.length; i++) { if(School - (lushi + a[i]) < 0 ){ continue; }else{ if(School -(lushi + a[i]) < School - (lushi + a[min])){ min = i; } } } System.out.println(a[min]/60+ " " +a[min]%60); } }
把时间都转换为分钟计数,上课时间-路上时间得到最晚起床时间,把所有闹钟时间排序后,二分查找最晚起床时间。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int h=0,m=0;
int[] a = new int[n];
for(int i=0;i<n;i++){
h = sc.nextInt();
m = sc.nextInt();
a[i] = h*60+m;
}
int t = sc.nextInt();
h = sc.nextInt();
m = sc.nextInt();
int p = h*60+m-t;
Arrays.sort(a);
t = Arrays.binarySearch(a,p);
if(t <0) t = -(t+2);
h = a[t]/60;
m = a[t]%60;
System.out.print(h+" "+m);
}
}
import bisect tomins = lambda h, m: h * 60 + m formats = lambda time: (time // 60, time % 60) n = int(input()) clocks = [tomins(*list(map(int, input().split()))) for i in range(n)] clocks.sort() dist = int(input()) schedule = tomins(*list(map(int, input().split()))) idx = bisect.bisect(clocks, schedule - dist) print(*formats(clocks[idx - 1]))
#include<iostream> using namespace std; int main(){ int N,Hi,Mi,x,time[100],A,B; cin>>N; for(int i=0;i<N;i++){ cin>>Hi>>Mi; time[i]=Hi*60+Mi; } cin>>x; cin>>A>>B; int classtime=A*60+B; int latest=0; for(int i=0;i<N;i++){ if( (time[i]+x<=classtime)&&(time[i]>latest) ){ latest=time[i]; } } Mi=latest%60; Hi=latest/60; cout<<Hi<<" "<<Mi<<endl; }
本套8道题全部pass的C++代码已挂到了我的GitHub(https://github.com/shiqitao/NowCoder-Solutions)
牛客网上的其他题目解答也在持续更新。
#include <iostream>
using namespace std;
int main()
{
int n; cin >> n;
int max_h = 0, max_m = 0, maxTime = 0;
int *hour = new int[n];
int *minute = new int[n];
int *time = new int[n];
for (int i = 0; i < n; i++) {
cin >> hour[i] >> minute[i];
time[i] = hour[i] * 60 + minute[i];
}
int X; cin >> X;
int reach_h, reach_m; cin >> reach_h >> reach_m;
int reachTime = reach_h * 60 + reach_m;
for (int i = 0; i < n; i++) {
if (time[i]>maxTime && time[i] + X <= reachTime) {
maxTime = time[i];
max_h = hour[i];
max_m = minute[i];
}
}
cout << max_h << " " << max_m;
delete[] hour;
delete[] minute;
delete[] time;
return 0;
}
n = int(input()) clock = [] for _ in range(n): temp = input() hm = list(map(int, temp.split())) # 以0点0分为原点,将所有闹钟时间转换为绝对时间 clock.append([temp, hm[0] * 60 + hm[1]]) # 到教室需要花费的时间 time_cost = int(input()) # 将上课时间也转换为绝对时间 hm = list(map(int, input().split())) target = hm[0] * 60 + hm[1] # 过滤掉会迟到的闹钟时间 clock = [item for item in clock if item[1] + time_cost <= target] # 选择最接近上课时间的闹钟时间 print(sorted(clock, key=lambda x: target - x[1])[0][0])
#include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<pair<int,int>> v(n); for(int i=0;i<n;i++) { cin >> v[i].first >> v[i].second; } sort(v.begin(), v.end()); int dt; cin >> dt; pair<int,int> dead; cin >> dead.first >> dead.second; for(int i=1;i<n;i++) { int carry = (v[i].second + dt)/60; int val = (v[i].second + dt)%60; int new1 = v[i].first + carry; int new2 = val; if(new1 > dead.first || (new1==dead.first && new2>dead.second) ) { cout << v[i-1].first << " " << v[i-1].second << endl; break; } } return 0; }话说这题数据要是跨24小时就麻烦了
#include<iostream> (720)#include<algorithm> using namespace std; struct time{ int h,min; }; int cmp(struct time a,struct time b){ if(a.h<b.h){ return 1; }else if(a.h==b.h){ if(a.min<b.min){ return 1; }else{ return 0; } }else{ return 0; } } int main(){ int n,x; struct time t[105]; struct time s; cin>>n; for(int i=0;i<n;i++){ cin>>t[i].h>>t[i].min; } sort(t,t+n,cmp); cin>>x; cin>>s.h>>s.min; int flag=0; for(int i=0;i<n;i++){ int temph,tempmin; temph=t[i].h+(t[i].min+x)/60; tempmin=(t[i].min+x)%60; if((temph<s.h)||(temph==s.h&&tempmin<=s.min))continue; else{ cout<<t[i-1].h<<" "<<t[i-1].min<<endl; flag=1; break; } } if(flag==0)cout<<t[n-1].h<<" "<<t[n-1].min<<endl; return 0; }
import java.util.Arrays; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); //输入闹钟个数 int n = sc.nextInt(); int[] clock = new int[n]; //输入闹钟时间 for (int i = 0; i < n; i++) { int hour = sc.nextInt(); int minute = sc.nextInt(); clock[i] = hour*60 + minute; } Arrays.sort(clock); int walkTime = Integer.parseInt(sc.next()); int hour = sc.nextInt(); int minute = sc.nextInt(); int classTime = hour*60+minute; int getupTime = classTime-walkTime; int i = n-1; //如果闹钟大于起床时间,继续往下找到最晚起床时间 while (getupTime < clock[i]){ i--; } System.out.println(clock[i]/60+" "+clock[i]%60); } }
//单位转换 遍历数组 clockArr[j]> 上课时间schoolTimeMax - 赶路时间x const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) let inArr = [] rl.on('line', line=>{ if(!line) return inArr.push(line.trim()) let len = inArr.length let n = +inArr[0] //n: alarm number if(len == n+3){ let x = inArr[len-2] //x: 起床到教室需要X(0<=X<=100)分钟 let schoolTime = inArr[len-1].trim().split(' ') //schoolTime:上学时间(h,m) let schoolTimeMax = +(schoolTime[0])*60 + +(schoolTime[1]) let clockArr = []; //clockArr: n行 data //遍历 n行闹钟数的 data for(let i=0;i<n;i++){ let clock = inArr[i+1].trim().split(' ') clockArr[i] = +(clock[0])*60 + +(clock[1]) } clockArr.sort((a,b)=>a-b) for(let j=clockArr.length-1;j>=0;j--){ if(clockArr[j] > (schoolTimeMax-x)) continue else { console.log(Math.floor(clockArr[j] / 60), clockArr[j] % 60) break } } } })
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); int N=sc.nextInt(); int[] arr=new int[N]; for(int i=0;i<N;i++){ int Hi=sc.nextInt(); int Mi=sc.nextInt(); arr[i]=Hi*60+Mi; } Arrays.sort(arr); int X=sc.nextInt(); int A=sc.nextInt(); int B=sc.nextInt(); int sk=A*60+B; for(int i=0;i<N;i++){ int t=sk-X-arr[i]; if(t==0){ System.out.print(arr[i]/60+" "+arr[i]%60); break; } if(t<0){ System.out.print(arr[i-1]/60+" "+arr[i-1]%60); break; } } } }
先将所有的闹钟时间按照从早到晚排序。
通过上课时间和赶路时间计算出最晚起床时间。
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); Integer[][] alarms = new Integer[N][2]; for (int i = 0; i < N; ++i) { alarms[i][0] = scanner.nextInt(); alarms[i][1] = scanner.nextInt(); } // 对闹钟进行排序 Arrays.sort(alarms, (Integer[] a1, Integer[] a2)->{ // 如果时不相等就返回时的比较结果 if (a1[0].compareTo(a2[0]) != 0) { return a1[0].compareTo(a2[0]); } else { // 否则返回分的比较结果 return a1[1].compareTo(a2[1]); } }); int X = scanner.nextInt(); int A = scanner.nextInt(); int B = scanner.nextInt(); // 算出最晚起床时间 A -= X / 60; X %= 60; if (B >= X) { B -= X; } else { --A; B = B + 60 - X; } Integer[] getUp = {A, B}; // 用二分查找在所有闹钟时间中查找起床时间 int result = Arrays.binarySearch(alarms, getUp, (Integer[] a1, Integer[] a2)->{ // 如果时不相等就返回时的比较结果 if (a1[0].compareTo(a2[0]) != 0) { return a1[0].compareTo(a2[0]); } else { // 否则返回分的比较结果 return a1[1].compareTo(a2[1]); } }); // 如果正好找到就输出此闹钟 if (result >= 0) { System.out.println(alarms[result][0] + " " + alarms[result][1]); } else { // 如果没有恰好相等的,返回的是恰好大于起床时间的那个闹钟的 - index - 1, // 所以要输出 - result - 2 位置的闹钟。 System.out.println(alarms[- result - 2][0] + " " + alarms[- result - 2][1]); } } }
import java.util.*; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner cin=new Scanner (System.in); int n=cin.nextInt();//闹钟数量 int a[][]=new int[n][2]; for(int i=0;i<n;i++) { a[i][0]=cin.nextInt();//当天的A时B分中的A a[i][1]=cin.nextInt();//当天的A时B分中的B } int c[][]=new int[1][2]; int x=cin.nextInt();//去教室需要用到的时间 int b[][]=new int [1][2];//上课时间A时B分 b[0][0]=cin.nextInt(); b[0][1]=cin.nextInt(); if(x<b[0][1]) { c[0][0]=b[0][0]; c[0][1]=b[0][1]-x; } else if(x==b[0][1]) { c[0][0]=b[0][0]; c[0][1]=0; } else { if(x-b[0][1]<=60) { c[0][0]=b[0][0]-1; c[0][1]=60-(x-b[0][1]); } else { c[0][0]=b[0][0]-2; c[0][1]=60-(x-b[0][1]-60); } } for (int i = 1; i < n; i++) { int temp0 = a[i][0];// 待插入的值 int temp1 = a[i][1];// 待插入的值 int index = i;// 待插入的位置 while ((index > 0 && a[index - 1][0] > temp0) || (index > 0 && (a[index - 1][0] == temp0 && index > 0 && a[index - 1][1] > temp1) )) { a[index][1] = a[index - 1][1];// 待插入的位置重新赋更大的值 a[index][0] = a[index - 1][0]; index--;// 位置往前移 } a[index][1] = temp1; a[index][0] = temp0; } int temp[][]=new int[1][2]; for(int i=0;i<n;i++) { if(c[0][0]<a[i][0] || (c[0][0]==a[i][0] && c[0][1]<a[i][1]))break; temp[0][0]=a[i][0]; temp[0][1]=a[i][1]; } System.out.print(temp[0][0]+" "+temp[0][1]); } }
#include<bits/stdc++.h> using namespace std; typedef pair<int, int> p; int main() { int N;cin >> N; p time[N]; for (int i = 0;i < N;i++) cin >> time[i].first >> time[i].second; sort(time, time + N); int X;cin >> X; int A, B;cin >> A >> B; //计算它最晚的起床时间 if (B - X >= 0) B = B - X; else { A -= 1; B = B - X + 60; } //和闹钟比较 for (int i = N - 1;i >= 0;i--) { if (time[i].first < A||(time[i].first == A && time[i].second <= B)) { cout << time[i].first<<' ' << time[i].second << endl; break; } } return 0; }别人的做法都是先转分钟再算,我这个是用pair来存储时钟和分钟,通过条件比较,比较条件会稍微比直接比分钟复杂,不过总体还好
import java.util.*; //1.将输入的闹钟时间转换成分钟数存入矩阵,方便计算 //2.将上课时间减去到达教室所需时间,得到起床时间 //3.由于只有闹钟响时才决定起不起床,因此在小于等于起床时间的所有闹钟里面,最大的那个就是我们需要的最晚闹钟时间 public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); //时间转换成分钟数 int[] minutes = new int[N]; int hour = 0; int minute = 0; for(int i = 0; i < N; i++){ hour = sc.nextInt(); minute = sc.nextInt(); minutes[i] = hour * 60 + minute; } int needTime = sc.nextInt(); hour = sc.nextInt(); minute = sc.nextInt(); int classTime = hour * 60 + minute; //得到最晚起床时间 int lastMinute = classTime - needTime; //设置一个max,在小于等于起床时间的闹钟时间里,更新最大的闹钟时间为max int max = 0; for(int i = 0; i < N; i++){ if(lastMinute >= minutes[i]){ max = Math.max(max, minutes[i]); } } //转换成时间 hour = max / 60; minute = max % 60; System.out.print(hour + " " + minute); } }
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { int n = sc.nextInt(); ArrayList<Integer> array = new ArrayList<Integer>(); for(int i = 0;i<n;i++) { int p = sc.nextInt(); int q = sc.nextInt(); array.add(p*60+q); } int need = sc.nextInt(); int hour = sc.nextInt(); int second = sc.nextInt(); int overTime = hour*60 + second; int num = 0; int abs = overTime; for(int i =0;i<n;i++) { if((array.get(i)+need)<=overTime) { if(overTime-(array.get(i)+need)<=abs) { abs = overTime-(array.get(i)+need); num = i; } } } System.out.println(array.get(num)/60 + " "+array.get(num)%60); } } }
import sys def plus_time(t,x): if t[1]+x<60: return [t[0],t[1]+x] else: return [t[0]+1,t[1]+x-60] if __name__=='__main__': n=int(sys.stdin.readline().strip()) time=[] for i in range(n): time.append(list(map(int,sys.stdin.readline().split()))) x=int(sys.stdin.readline().strip()) start=list(map(int,sys.stdin.readline().split())) time=sorted(time,key=lambda x:x[::1]) i=0 while i<len(time): if plus_time(time[i],x)[0]<start[0]: i+=1 elif plus_time(time[i],x)[0]==start[0] and plus_time(time[i],x)[1]<=start[1]: i+=1 else: print(' '.join(map(str,time[i-1]))) break