天梯赛 7-9 抢红包(25 分)

    科技2022-08-22  98

    7-9 抢红包 (25分)

    没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。

    输入格式: 输入第一行给出一个正整数N(≤10 ​4 ​​ ),即参与发红包和抢红包的总人数,则这些人从1到N编号。随后N行,第i行给出编号为i的人发红包的记录,格式如下:

    KN ​1 ​​ P ​1 ​​ ⋯N ​K ​​ P ​K ​​

    其中K(0≤K≤20)是发出去的红包个数,N ​i ​​ 是抢到红包的人的编号,P ​i ​​ (>0)是其抢到的红包金额(以分为单位)。注意:对于同一个人发出的红包,每人最多只能抢1次,不能重复抢。

    输出格式: 按照收入金额从高到低的递减顺序输出每个人的编号和收入金额(以元为单位,输出小数点后2位)。每个人的信息占一行,两数字间有1个空格。如果收入金额有并列,则按抢到红包的个数递减输出;如果还有并列,则按个人编号递增输出。

    输入样例: 10 3 2 22 10 58 8 125 5 1 345 3 211 5 233 7 13 8 101 1 7 8800 2 1 1000 2 1000 2 4 250 10 320 6 5 11 9 22 8 33 7 44 10 55 4 2 1 3 8800 2 1 23 2 123 1 8 250 4 2 121 4 516 7 112 9 10 输出样例: 1 11.63 2 3.63 8 3.63 3 2.11 7 1.69 6 -1.67 9 -2.18 10 -3.26 5 -3.26 4 -12.32

    代码如下:

    #include<bits/stdc++.h> using namespace std; const int maxn=1e4+5; struct stu { double n=0,jin=0,num=0; }; bool cmp(stu a,stu b) //自定义结构体排序 { if(a.jin!=b.jin) return a.jin>b.jin; else //金额相同的情况 { if(a.num!=b.jin) return a.num>b.num; else return a.n>b.n; } } stu stu1[maxn]; int main() { int a1[maxn]={0},g=1; int n; cin>>n; int n1,jin1; int k; int n2=n; while(n2--) { cin>>k; while(k--) { cin>>n1>>jin1; stu1[n1].jin+=jin1; stu1[n1].num++; a1[g]+=jin1; //记录每个人发的红包钱数 } g++; } vector<stu>v; for(int i=1;i<g;i++) { stu1[i].jin-=a1[i]; //减去每个人发红包出去的钱 stu1[i].n=i; } for(int i=1;i<=n;i++) v.push_back(stu1[i]); sort(v.begin(),v.end(),cmp); //sort完输出即可 for(int i=0;i<v.size();i++) printf("%.0f %.2f\n",v[i].n,v[i].jin/100); return 0; }
    Processed: 0.015, SQL: 9