[UVA][strcasecmp] 11056 - Formula 1
Problem A – Formula 1
Time Limit: 1 second
It’s time for a new Formula 1 race and the board of directors decided that it’s also time for a new chronometer system. They bought all the ultra-modern radar-laser-microwave sensors to install in the starting line, but just realized the manufacturer didn’t provide the software to rank the cars.
That’s how you come to the game. The board of directors wants you to write a program that receives the time each pilot spent on their qualification lap and prints the starting grid for the race (i.e. the order in which the pilots must start the race). And they want it fast! I bet you can do it in the time of a pit stop!
(If you don’t know the rules that make the starting grid in Formula 1, consider that the least time the pilot spend on the qualification lap the best, i.e. the closest he will start of the beginning of the grid).
Input
The input file contains several input sets. The description of each set is given below:
Each set starts with one integer N (1 ≤ N ≤ 100), the number of participant pilots in the race, on the first line.
Then, N lines in the format “S : X min Y sec Z ms” will follow (quotes for clarity only). The value S represents the name of the pilot and consists of a string of 1 to 20 letters. The integers X (0 ≤ C ≤ 59), Y (0 ≤ C ≤ 59) and Z (0 ≤ C ≤ 999) represent the number of minutes, seconds and milliseconds, respectively, that the pilot spent on his qualification lap.
There is a blank line after each input set. Input is terminated by EOF.
Output
For each input set, your program must produce the starting grid, i.e. the order in which the pilots must start the race, in the following format. For each row in the grid (a pair of cars that start the race side by side), print a line containing “Row R”, where R represents the row number starting from 1, followed by two other lines containing the name of the pilots (as appear in the input) that start the race from that row (in order of classification). If one row contains only one pilot, just print one line after the row number. If there are two pilots with the same name on a test case, they are different pilots and the output must contain both pilots. If two or more pilots are tied in the classification time, sort them by their names (lexicographically, case-insensitive comparisons). Print a blank line after each test case.
Sample Input
3
Schumacher : 1 min 23 sec 172 ms
Barrichello : 2 min 12 sec 999 ms
Senna : 0 min 55 sec 582 ms
4
Schumacher : 1 min 23 sec 172 ms
Barrichello : 2 min 12 sec 999 ms
Senna : 0 min 55 sec 582 ms
Fangio : 1 min 03 sec 000 ms
2
BadPilot : 59 min 59 sec 999 ms
ABadPilot : 59 min 59 sec 999 ms
Sample Output
Row 1
Senna
Schumacher
Row 2
Barrichello
Row 1
Senna
Fangio
Row 2
Schumacher
Barrichello
Row 1
ABadPilot
BadPilot
Problem setter: Herbert de Mélo Duarte
依照時間排序,如果時間一樣比較選手名字,此時忽略大小寫的字典順序。
之後兩兩分一組。
使用 strcasecmp 去比較。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char name[105][150];
int time[105], IDX[105];
bool cmp(int a, int b) {
if(time[a] != time[b])
return time[a] < time[b];
return strcasecmp(name[a], name[b]) < 0;
}
int main() {
int n, i, j;
int mm, ss, mss;
while(scanf("%d", &n) == 1) {
for(i = 0; i < n; i++) {
scanf("%s : %d min %d sec %d ms", &name[i], &mm, &ss, &mss);
time[i] = mss + ss*1000 + mm*60000;
IDX[i] = i;
}
sort(IDX, IDX+n, cmp);
for(i = 0, j = 1; i < n; i += 2, j++) {
printf("Row %d\n", j);
puts(name[IDX[i]]);
if(i+1 < n)
puts(name[IDX[i+1]]);
}
puts("");
}
return 0;
}