每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399
输入N个员工,每个员工输出ID号,上班时间,下班时间,
第一行输出最早去的员工的ID和上班时间
第二行输出最迟走的员工的ID和下班时间
第三行输出工作最久的员工的ID和上班时间
输入样例:
ID100001 07:00:00 17:00:00
ID100002 08:00:00 18:00:00
ID100003 09:00:00 21:00:00
输出样例:
OPEN:ID100001, 07:00:00
CLOSE:ID100003, 21:00:00
LONGEST WORK TIME ID:ID100003, 09:00:00
解决方法:
(1)算法的基本思想:
本题主要是基于比较,将结构体定义在一起,主要是其中将所有的时间化作秒来计算比较方便
(2)代码实现:
#include
#include
using namespace std;
//定义时间结构体
typedef struct
{
int hour;
int min;
int sec;
} time;
//定义员工结构体
typedef struct
{
char id[100];
time t1, t2; //定义上班和下班的时间
int workTime; //员工的工作时间
} employee;
//比较员工上班时间最早的
bool cmp1(employee a, employee b)
{
if (a.t1.hour != b.t1.hour)
return a.t1.hour < b.t1.hour;
else if (a.t1.min != b.t1.min)
return a.t1.min < b.t1.min;
else
return a.t1.sec < b.t1.sec;
}
//比较员工下班时间最晚的
bool cmp2(employee a, employee b)
{
if (a.t2.hour != b.t2.hour)
return a.t2.hour > b.t2.hour;
else if (a.t2.min != b.t2.min)
return a.t2.min > b.t2.min;
else
return a.t2.sec > b.t2.sec;
}
//比较员工留在单位的时间最长的
bool cmp3(employee a, employee b)
{
return a.workTime > b.workTime;
}
int main()
{
//判断输入时间的合法性本示例程序省略
cout << "输入员工的数目:";
int n = 0;
cin >> n;
employee em[100]; //假设最多存在100个员工
cout << "输入每个员工的id,以及上下班时间:" << endl;
for (int i = 0; i < n; i++)
{
cin >> em[i].id;
scanf("%2d:%2d:%2d", &em[i].t1.hour, &em[i].t1.min, &em[i].t1.sec);
scanf("%2d:%2d:%2d", &em[i].t2.hour, &em[i].t2.min, &em[i].t2.sec);
em[i].workTime = (em[i].t2.hour * 3600 + em[i].t2.min * 60 + em[i].t2.sec) - (em[i].t1.hour * 3600 + em[i].t1.min * 60 + em[i].t1.sec);
}
//比较上班的时间来的最早的,每进行一次比较,就输出一次排序后的结果
sort(em, em + n, cmp1);
cout << "OPEN:";
cout << em[0].id << " ";
printf("%.2d:%.2d:%.2d\n", em[0].t1.hour, em[0].t1.min, em[0].t1.sec);
sort(em, em + n, cmp2);
cout << "CLOSE:";
cout << em[0].id << " ";
printf("%.2d:%.2d:%.2d\n", em[0].t2.hour, em[0].t2.min, em[0].t2.sec);
sort(em, em + n, cmp3);
cout << "LONGEST WORK TIME ID:";
cout << em[0].id << " ";
printf("%.2d:%.2d:%.2d\n", em[0].t1.hour, em[0].t1.min, em[0].t1.sec);
system("pause");
return 0;
}
有一个M*N的材料和一个s*t的模板,从材料中切除模板,求最大能切出来的模板的数量。
输入格式:
第一行 M N
下面的M行N列:材料的具体内容
s 和 t
下面的s行t列:模板材料的具体内容
输出格式:
最大能切出来的模板的数量
输入样例:
3 4
a b c d
c d a b
a c c d
2 2
a b
c d
输出样例:
2