一、题目:
二、解题思路:
1.首先对于这道题目:我们最先想到的使用:
结构体数组来实现:
定义一个h、m、s分别存储对应的时分秒,id存储学号
2.对结构体数组进行初始化;
3.定义一个bool类型的b数组(题目说有全班n位同学,有m条数据,这m条数据是看过快手的同学,而如果没有看快手的同学就没有数据,但是对这些没有看快手的同学也需要处理,输出)
4.接着在main()函数中,根据题目的输入要求编写输入的相关代码(具体看下面代码)
要注意的是:对于时间类的输入,使用scanf函数来比较容易,毕竟有个:,而且输出时也比较容易;
对于计算每个人的观看时间:统一化成秒来进行比较,这样简单了很多
5.然后是输出的准备工作:利用化成秒数来进行计算;
6.最后是输出(要注意有“没有看过快手的输出”这种特殊情况)
三、编写代码:
#include<bits/stdc++.h>
#include <cstdio>
#include<cstdlib>
#include<map>
using namespace std;
struct no
{
int h,m,s,t;
int id;
}arr[10001];
bool b[1001];//用来记录是否看过快手,因为没看过不会输入时间的
bool cmp(no x,no y)
{
if(x.t == y.t) return x.id < y.id;
else return x.t > y.t;
}
int main()
{
memset(b,false,sizeof(b));//全部初始化为false
//初始化所有人
for(int i = 0; i < 1001; i++)
{
arr[i].h = arr[i].m = arr[i].s = arr[i].t = 0;
arr[i].id = i;
}
int n,m;
int num;
int h1,m1,s1,h2,m2,s2;
int t,t1,t2;
cin >> n >> m;
for(int i = 0; i < m; i++)
{
scanf("%d %d:%d:%d %d:%d:%d",&num,&h1,&m1,&s1,&h2,&m2,&s2);
b[num] = true;//记录看过快手的人
arr[num].id = num;
t1 = h1*3600 + m1*60 + s1;
t2 = h2*3600 + m2*60 + s2;
arr[num].t += t2 - t1;//一共看了多少时间
}
sort(arr,arr+n,cmp);
//输出内容的准备工作
for(num = 0; num < n; num++)
{
t = arr[num].t;
arr[num].h += t/3600;//时
t -= t/3600 * 3600;//减去小时的秒
arr[num].m += t/60;//分
t -= t/60 *60;
arr[num].s += t;//秒
if(arr[num].s >= 60)
{
arr[num].m += arr[num].s / 60;
arr[num].s -= arr[num].s % 60;
}
}
//输出
for(int i = 0; i < n; i++)
{
if(b[arr[i].id]==false)//没有看过快手的输出
printf("%03d 00:00:00\n",arr[i].id);
else
printf("%03d %02d:%02d:%02d\n",arr[i].id,arr[i].h,arr[i].m,arr[i].s);
}
return 0;
}