团体天梯练习 L2-009 抢红包

发布时间 2023-04-17 12:52:09作者: Amαdeus

L2-009 抢红包

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

输入格式:

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

\(K\) \(N_{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


解题思路

水题,按照题意模拟并排序即可。

/*   一切都是命运石之门的选择  El Psy Kongroo  */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<functional>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<double, double> pdd;
typedef pair<string, int> psi;
typedef __int128 int128;
#define PI acos(-1.0)
#define x first
#define y second
//int dx[4] = {1, -1, 0, 0};
//int dy[4] = {0, 0, 1, -1};
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;

const int N = 10010;
int n, m, k, t, sum;
struct node{
    int id, num, money;
}p[N];

void show(){
    for(int i = 1; i <= n; i ++ ) printf("%d %.2lf\n", p[i].id, 0.01 * p[i].money);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n;
    for(int i = 1; i <= n; i ++ ){
        p[i].id = i;
        cin >> m;
        sum = 0;
        while(m -- ){
            cin >> k >> t;
            p[k].money += t;
            p[k].num ++ ;
            sum += t;
        }
        p[i].money -= sum;
    }

    sort(p + 1, p + n + 1, [](node &a, node &b){
        if(a.money != b.money) return a.money > b.money;
        if(a.num != b.num) return a.num > b.num;
        return a.id < b.id;
    });

    show();

    return 0;
}