题意
按照最后每个人收入金额从高到低的的顺序输出,如果收入金额有并列,则按抢到红包的个数从多到少输出;如果还有并列,则按个人编号从小到大输出。
思路
- 1.结构体存放每个人的收入金额和红包数
- 2.按照题意要求将每个人排序
坑点
- 1.最后是浮点数形式
- 2.需要保留2位小数
- 3.每个人不仅收到红包时金额增加同时也发出红包金额需要减少
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;struct name{
int bh;//编号
int sy;//红包最后收益
int sm;//收到红包数
}a[10010];
bool cmp(name s,name e)//按照题目要求排序
{
if(s.sy==e.sy)
{
if(s.sm==e.sm) return s.bh<e.bh;//从小到大
else return s.sm>e.sm;//从大到小
}
else return s.sy>e.sy;//从大到小
}
int main()
{
int n,k;
cin>>n;
for(int i=1;i<=n;i++)
{
a[i].bh=i;//编号的确定
cin>>k;
while(k--)
{
int n,p;
cin>>n>>p;
a[n].sm++;//红包数量的增加
a[n].sy+=p;//收入金额的增加
a[i].sy-=p;//发红包的人的金额的减少
}
}
sort(a+1,a+1+n,cmp);//从a[1]开始;
for(int i=1;i<=n;i++)//输出对应的编号和输入金额
{
cout<<a[i].bh<<" ";
printf("%.2lf\n",(double)a[i].sy/100);//保留2位小数
}
return 0;
}