问题描述 实验室使用考勤系统对学生进行考勤。考勤系统会记录下每个学生一天内每次进出实验室的时间。 每位学生有一个唯一编号,每条考勤记录包括学生的编号,进入时间、离开时间。 给出所有学生一天的考勤记录,请统计每个学生在实验室工作的时间,并按照工作时间从长到短给出一天的统计表,工作时间相同时按编号从小到大排序。 输入说明 输入的第一行包含一个整数n,表示考勤记录条数。1≤n≤100,学生的编号为不超过100的正整数。 接下来是n行,每行是一条考勤记录,每条记录包括学生编号k,进入时间t1和离开时间t2三项。 t1和t2格式为“hh:mm”,即两位数表示的小时和两位数表示的分钟。例如14:20表示下午两点二十分,所有时间均为24小时制,且均为同一天内的时间。 输出说明 输出按工作时间和学生编号排序的统计表。统计表包含若干行,每行为一个学生的出勤记录,由学生编号和总工作时间构成,总工作时间以分钟为单位。 输入样例 5 3 08:00 11:50 1 09:00 12:00 3 13:50 17:30 1 14:00 18:00 2 17:00 24:00 输出样例 3 450 1 420 2 420
思路:
1将时间转换为整数;
2将学号排序,确保同类型时长合并;(qwq)(合并合并到某项,确保后续排序输出)
(不知道有无简单方法将结构体中某同类型合并)
3将总时长排序,一部分同类型时长归零,自动移到前面,同时对学号排序
4从大到小输出,时长为零跳出输出即可
#include<stdio.h>
typedef struct stu
{
int xue;
char c1[6];
char c2[6];
int sum;
}cm;
int main()
{
int n;
scanf("%d",&n);
int i,k;
cm a[n],b;
for(i=0;i<n;i++)
{
scanf("%d %s %s",&a[i].xue,a[i].c1,a[i].c2);
a[i].sum=-((a[i].c1[0]-'0')*10*60+(a[i].c1[1]-'0')*60
+(a[i].c1[3]-'0')*10+(a[i].c1[4]-'0'))+((a[i].c2[0]-'0')*10*60+(a[i].c2[1]-'0')*60
+(a[i].c2[3]-'0')*10+(a[i].c2[4]-'0'));
}
for(i=0;i<n-1;i++)
{
for(k=0;k<n-i-1;k++)
{
if(a[k].xue>a[k+1].xue)
{
b=a[k];
a[k]=a[k+1];
a[k+1]=b;
}
}
}
for(i=0;i<n-1;i++)
{
if(a[i].xue==a[i+1].xue)
{
a[i+1].sum+=a[i].sum;
a[i].sum=0;
}
}
for(i=0;i<n-1;i++)
{
for(k=0;k<n-i-1;k++)
{
if(a[k].sum>a[k+1].sum)
{
b=a[k];
a[k]=a[k+1];
a[k+1]=b;
}
else if(a[k].sum==a[k+1].sum)
{
if(a[k].xue<a[k+1].xue)
{
b=a[k];
a[k]=a[k+1];
a[k+1]=b;
}
}
}
}
for(i=n-1;i>=0;i--)
{
if(a[i].sum==0)break;
printf("%d %d",a[i].xue,a[i].sum);
printf("\n");
}
}