年底,报销都挤在一堆,财务忙得不可开交。每个报销表包括姓名,各项费用的金额。对于每个报销单,这里规定按如下要求处理:
- 金额高的优先处理;
- 若金额相等时,则姓名字典序小的优先处理;
- 若金额和姓名都相等,则按报销单来得早的优先处理。
请帮财务排好报销单的处理顺序。
输入格式:
首先输入一个整数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 1900
Case 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;
}