怎么解决这道编程c++问题?

【题目描述】同学们应该在指定的上课时间到达教室,然而并不是每个同学都能按时到,于是老师决定制作一份迟到光荣榜,凡是没能准时到的同学都榜上有名。具体而言,上课时刻为T,你将... 【题目描述】
同学们应该在指定的上课时间到达教室,然而并不是每个同学都能按时到,于是老师决定制作一份迟到光荣榜,凡是没能准时到的同学都榜上有名。

具体而言,上课时刻为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,且所有时刻是同一天。
展开
 我来答
听不清啊
高粉答主

2020-05-03 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部

#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;

}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式