7-3 报销

年底,报销都挤在一堆,财务忙得不可开交。每个报销表包括姓名,各项费用的金额。对于每个报销单,这里规定按如下要求处理:

  • 金额高的优先处理;
  • 若金额相等时,则姓名字典序小的优先处理;
  • 若金额和姓名都相等,则按报销单来得早的优先处理。

请帮财务排好报销单的处理顺序。

输入格式:

首先输入一个整数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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值