题目链接:URAL 1821 Biathlon
题意不说了。。太麻烦。。挺不好懂的。。
先把每个人的到达时间排序,注意题目中给的不是到达时间而是奔跑时间。到达时间=奔跑时间+(i * 30),i从0开始。第一个人不用加30。
先把第一个人的奔跑时间,当成最优解,设一个变量表示人数,设为1(第一个人的名字肯定出现在牌子上,想想为什么),之后遍历,维持一个当前最优解,如果后边的人奔跑时间比前一个奔跑时间短,改变这个最优解,并将人数+1。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
struct Person
{
char name[100];
double time, cost;
};
int n;
char str[100];
Person per[120];
double h, m;
void init()
{
for(int i = 0; i < n; i++)
{
scanf("%s", per[i].name);
scanf("%lf:%lf", &h, &m);
per[i].cost = h * 60 + m;
per[i].time = i * 30 + per[i].cost;
}
}
int cmp(Person a, Person b)
{
return a.time < b.time;
}
int cmp2(const void *a,const void *b)
{
char *aa = (char *) a;
char *bb = (char *) b;
return strcmp(aa,bb);
}
char res[120][50];
int main()
{
scanf("%d", &n);
init();
sort(per, per + n, cmp);
strcpy(res[0],per[0].name);
int cnt = 1;
double best = per[0].cost;
for(int i = 1; i < n; i++)
{
if(per[i].cost < best)
{
strcpy(res[cnt],per[i].name);
cnt++;
best = per[i].cost;
}
}
qsort(res, cnt, sizeof(res[0]), cmp2);
cout << cnt << endl;
for(int i = 0; i < cnt; i++)
cout << res[i] << endl;
return 0;
}