题目:有10个足球队员,每人有攻击力和防守力,分成两组分别为进攻和防守组,每组5人,
要求:攻击组5人攻击总和最大,相同时防守组防守总和最大,又相同按名字顺序。
分析:排序。多级排序,依次为:攻击递减、防御递增、名字递增。
说明:输出时要按名字顺序,需要组内再次排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _player
{
char name[24];
int attack;
int defend;
}player;
int cmp1(const void *a, const void *b)
{
player *p = (player *)a;
player *q = (player *)b;
if (p->attack == q->attack) {
if (p->defend == q->defend) {
return strcmp(p->name, q->name);
}else {
return p->defend - q->defend;
}
}else {
return q->attack - p->attack;
}
}
int cmp2(const void *a, const void *b)
{
player *p = (player *)a;
player *q = (player *)b;
return strcmp(p->name, q->name);
}
int main()
{
int T;
player P[10];
while (~scanf("%d",&T))
for (int t = 1; t <= T; ++ t) {
for (int i = 0; i < 10; ++ i) {
scanf("%s %d %d",P[i].name,&P[i].attack,&P[i].defend);
}
qsort(P, 10, sizeof(player), cmp1);
qsort(P+0, 5, sizeof(player), cmp2);
qsort(P+5, 5, sizeof(player), cmp2);
printf("Case %d:\n",t);
printf("(");
for (int i = 0; i < 5; ++ i) {
printf("%s",P[i].name);
if (i == 4) {
printf(")\n(");
}else {
printf(", ");
}
}
for (int i = 5; i < 10; ++ i) {
printf("%s",P[i].name);
if (i == 9) {
printf(")\n");
}else {
printf(", ");
}
}
}
return 0;
}