年底,报销都挤在一堆,财务忙得不可开交。每个报销表包括姓名,各项费用的金额。对于每个报销单,这里规定按如下要求处理:
- 金额高的优先处理;
- 若金额相等时,则姓名字典序小的优先处理;
- 若金额和姓名都相等,则按报销单来得早的优先处理。
请帮财务排好报销单的处理顺序。
输入格式:
首先输入一个整数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开始,若费用相同,则排名也相同,否则排名为排序后的序号)、原编号、姓名、总费用,每两个数据之间留一个空格。每两组测试数据之间留一个空行。
输入样例:
2
4 5
Tom 100 900 200 100 700
Jack 1000 400 500 50 50
Sara 700 100 200 1000 300
Iris 100 900 200 100 600
3 2
Tom 2600 400
Jack 3800 800
Mary 3100 100
输出样例:
Case 1:
1 3 Sara 2300
2 2 Jack 2000
2 1 Tom 2000
4 4 Iris 1900Case 2:
1 2 Jack 4600
2 3 Mary 3200
3 1 Tom 3000
个人思路:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
struct MyStruct
{int no;char name[100];int sum;
};
int cmp(const void* p1, const void* p2)
{if (((struct MyStruct*)p1)->sum != ((struct MyStruct*)p2)->sum){return ((struct MyStruct*)p2)->sum - ((struct MyStruct*)p1)->sum;}else{return strcmp(((struct MyStruct*)p1)->name, ((struct MyStruct*)p2)->name);}}
int main()
{int n;scanf("%d", &n);int No=0;while (n--){int count=1;int x, y;int sum = 0;scanf("%d %d", &x, &y);int t = x;struct MyStruct arr[t];for (int i = 0; i < x; i++){sum = 0;arr[i].no=i+1;scanf("%s", arr[i].name);int a;for (int j = 0; j < y; j++){scanf("%d", &a);sum = sum + a;}arr[i].sum = sum;}qsort(arr, t, sizeof(arr[0]), cmp);No++;printf("Case %d:\n",No);for (int k = 0; k < t; k++){if(arr[k].sum!=arr[k-1].sum){count=k+1;}printf("%d %d %s %d\n",count, arr[k].no,arr[k].name, arr[k].sum);}if(n!=0){printf("\n");}}return 0;
}