用c语言编写如下程序:年底,报销都挤在一堆,财务忙得不可开交。每个报销表包括姓名,各项费用的金额。对于每个报销单,这里规定按如下要求处理: 金额高的优先处理; 若金额相等时,则姓名字典序小的优先处理; 若金额和姓名都相等,则按报销单来得早的优先处理。 请帮财务排好报销单的处理顺序。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试数据,先输入2个正整数n、m(1≤n≤20,1≤m≤10),然后是n行输入,第i行先输入第i个报销单上的姓名(长度不超过10个字符,且只包含大小写英文字母),然后再输入m个整数,表示第i个报销单上的各项费用,数据之间都以一个空格分隔,第i行输入的编号为i,编号越小表示来得越早。 输出格式: 对于每组测试,输出n+1行,第一行是“Case k:”,其中k表示是第k组测试;对于后面的n行,每行包含一个按规定要求排好序之后的报销单信息,包括:费用排名(从1开始,费用相同则排名也相同)、原编号、姓名、总费用,每两个数据之间留一个空格。每两组测试数据之间留一个空行。
时间: 2023-10-11 13:05:30 浏览: 157
```c
#include <stdio.h>
#include <string.h>
#define MAXN 20
#define MAXM 10
struct Expense {
char name[15];
int cost[MAXM];
int total;
int id;
} expenses[MAXN];
int cmp(const void* a, const void* b) {
struct Expense* A = (struct Expense*) a;
struct Expense* B = (struct Expense*) b;
if (A->total != B->total) {
return B->total - A->total;
} else if (strcmp(A->name, B->name) != 0) {
return strcmp(A->name, B->name);
} else {
return A->id - B->id;
}
}
int main() {
int T;
scanf("%d", &T);
for (int t = 1; t <= T; ++t) {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) {
scanf("%s", expenses[i].name);
expenses[i].total = 0;
for (int j = 0; j < m; ++j) {
scanf("%d", &expenses[i].cost[j]);
expenses[i].total += expenses[i].cost[j];
}
expenses[i].id = i + 1;
}
qsort(expenses, n, sizeof(struct Expense), cmp);
printf("Case %d:\n", t);
for (int i = 0; i < n; ++i) {
printf("%d %d %s %d\n", i + 1, expenses[i].id, expenses[i].name, expenses[i].total);
}
if (t < T) {
printf("\n");
}
}
return 0;
}
```
阅读全文