年底,报销都挤在一堆,财务忙得不可开交。每个报销表包括姓名,各项费用的金额。对于每个报销单,这里规定按如下要求处理:
- 金额高的优先处理;
- 若金额相等时,则姓名字典序小的优先处理;
- 若金额和姓名都相等,则按报销单来得早的优先处理。
请帮财务排好报销单的处理顺序。
输入格式:
首先输入一个整数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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<bits/stdc++.h>
using namespace std;
struct xx { //结构体
int bh; //原始编号
string xm; //姓名
int je; //总保险金额
} s[105];
bool cmp(xx a,xx b) {
if(a.je!=b.je) return a.je>b.je; //从小到大按总保险金额排序
if(a.xm!=b.xm) return a.xm<b.xm;//从小到大按姓名字典序排序
return a.bh<b.bh; //从小到大按原始编号排序
}
int main() {
int a,ans=0;
cin>>a;
while(a--) {
ans++;
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) { //结构体初始化
s[i].bh=i;
s[i].je=0;
s[i].xm="";
}
for(int i=1; i<=n; i++) {
string w;
cin>>w;
s[i].xm=w; //姓名
for(int j=1; j<=m; j++) {
int k;
cin>>k;
s[i].je+=k; //总金额
}
}
sort(s+1,s+n+1,cmp); //sort c++自带排序函数 cmp自定义排序规则看上面
printf("Case %d:\n",ans);
int u=1;
for(int i=1; i<=n; i++) {
cout<<u<<" "<<s[i].bh<<" "<<s[i].xm<<" "<<s[i].je;
if(s[i+1].je!=s[i].je) u=i+1; //总金额相同时编号不变
if(i!=n) cout<<endl; //题目格式要求
}
if(a!=0) {
cout<<endl<<endl; //题目格式要求
}
}
return 0;
}
栈限制
8192 KB