怎么解决这道编程c++问题?
同学们应该在指定的上课时间到达教室,然而并不是每个同学都能按时到,于是老师决定制作一份迟到光荣榜,凡是没能准时到的同学都榜上有名。
具体而言,上课时刻为T,你将得到n名同学的姓名s
1
,s
2
,⋯,s
n
和到达时刻t
1
,t
2
,⋯,t
n
,对第i名同学,如果他的到达时刻t
i
晚于T,则被认为迟到。
你需要把所有迟到的同学的的姓名和实际到达时间列出来,迟到时间越长的越靠前,如果到达时刻一样,则姓名字典序更小的在前。
【输入格式】
输入共n+1行:
第1行,两个用空格隔开的正整数n,T,表示总人数和上课时间;
之后n行中的第i行,为用空格隔开的两个字符串s
i
,t
i
,分别表示第i名同学的姓名和到达时间,其中时间精确到分钟。s
i
仅由小写字母构成,t
i
以hh:mm的格式给出时间,例如“十一点五分”格式为11:05。
【输出格式】
输出为若干行:
每行为用空格隔开的两个字符串s
i
,t
i
,分别表示按要求排序后的第i名迟到同学的姓名和到达时间,格式与输入一致。
【输入样例#1】
6 17:50
wwf 17:20
xiaoming 17:55
xiaohong 18:10
yuanyuan 18:01
adam 17:55
eva 17:50
【输出样例#1】
xiaohong 18:10
yuanyuan 18:01
adam 17:55
xiaoming 17:55
【样例解释】
共有6名同学,上课时间为17:50。
wwf来得最早,eva也恰好在17:50到达,两人不算迟到;
xiaohong在18:10到达,迟到长达20分钟,名列榜首,yuanyuan紧随其后;之后,adam,xiaoming是同时到达的,adam字典序靠前,因此排在xiaoming之前。
【数据说明】
对20%的测试点,n=5;
对60%的测试点,5≤n≤100;
对80%的测试点,5≤n≤5000;
对100%的测试点,5≤n≤200000;1≤ s
i
的长度 ≤20;
t
i
保证为24小时制中的一个时间,00:00∼23:59,且所有时刻是同一天。 展开
#include <bits/stdc++.h>
using namespace std;
typedef struct
{ char name[20];
int time;
} stu;
stu a[200000];
bool cmp(stu a,stu b)
{ return a.time>b.time||a.time==b.time&&strcmp(a.name,b.name)>0;
}
int main()
{ int n,i,j,h,m,h0,m0;
scanf("%d%d:%d",&n,&h0,&m0);
m0+=60*h0;
for(i=0; i<n; i++)
{ scanf("%s%d:%d",a[i].name,&h,&m);
a[i].time=60*h+m;
}
// cout<<"============\n"; //此行可删去
sort(a,a+n,cmp);
for(i=0; a[i].time>m0; i++)
printf("%s %d:%02d\n",a[i].name,a[i].time/60,a[i].time%60);
return 0;
}
不行啊,网站评测只有20分,有些地方不对。
把<打错了方向。已经改过来了:
#include <bits/stdc++.h>
using namespace std;
typedef struct
{ char name[20];
int time;
} stu;
stu a[200000];
bool cmp(stu a,stu b)
{ return a.time>b.time||a.time==b.time&&strcmp(a.name,b.name)<0;
}
int main()
{ int n,i,j,h,m,h0,m0;
scanf("%d%d:%d",&n,&h0,&m0);
m0+=60*h0;
for(i=0; i<n; i++)
{ scanf("%s%d:%d",a[i].name,&h,&m);
a[i].time=60*h+m;
}
//cout<<"============\n"; //此行可删去
sort(a,a+n,cmp);
for(i=0; a[i].time>m0; i++)
printf("%s %d:%02d\n",a[i].name,a[i].time/60,a[i].time%60);
return 0;
}
2020-05-11
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int T,n;
struct STU{
string s;
int t;
bool operator < (const STU&a) const {
if(t!=a.t) return t>a.t;
return s<a.s;
}
};
STU student[200005];
int main(){
string T_temp;
cin>>n>>T_temp;
int hoursa=(T_temp[0]-'0')*10+(T_temp[1]-'0');
int minutea=(T_temp[3]-'0')*10+(T_temp[4]-'0');
T=hoursa*60+minutea;
int temp=0;
for(int i=0;i<n;i++){
string s;
string t;
cin>>s>>t;
int hours=(t[0]-'0')*10+(t[1]-'0');
int minute=(t[3]-'0')*10+(t[4]-'0');
int time=hours*60+minute;
time-=T;
if(time<=0) continue;
STU temp2;
temp2.s=s;
temp2.t=time;
student[temp]=temp2;
temp++;
}
sort(student,student+temp);
for(int i=0;i<temp;i++){
cout<<student[i].s<<" ";
int ttt=student[i].t+T;
cout<<ttt/60<<":"<<ttt-(ttt/60)*60<<endl;
}
return 0;
}