L2-009. 搶紅包(排序)
阿新 • • 發佈:2019-01-23
沒有人沒搶過紅包吧…… 這裡給出N個人之間互相發紅包、搶紅包的記錄,請你統計一下他們搶紅包的收穫。
輸入格式:
輸入第一行給出一個正整數N(<= 104),即參與發紅包和搶紅包的總人數,則這些人從1到N編號。隨後N行,第i行給出編號為i的人發紅包的記錄,格式如下:
K N1 P1 ... NK PK
其中K(0 <= K <= 20)是發出去的紅包個數,Ni是搶到紅包的人的編號,Pi(> 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 <iostream> #include <algorithm> #include <string> #include <stdio.h> #include <string.h> #include <math.h> #include <vector> #include <set> #define ll long long using namespace std; struct data { int num; // 搶到紅包的人的編號 int sum; // 搶到紅包的數量 int money; // 搶到的金額 }a[10101]; bool cmp(data x, data y)// 編號已經排好序了,不需要進行排序 { if (x.money == y.money) return x.sum > y.sum; return x.money > y.money; } int main() { int n, m, x, y; while(~scanf("%d", &n)) { for (int i = 0;i <= n;i ++) { a[i].num = i; a[i].sum = 0; a[i].money = 0; } for (int i = 1;i <= n;i ++) { scanf("%d", &m); for (int j = 0;j < m;j ++) { scanf("%d%d", &x, &y); a[i].money -= y; a[x].money += y; a[x].sum += 1; } } sort(a + 1, a + n + 1, cmp); for (int i = 1;i <= n;i ++) printf("%d %.2f\n", a[i].num, a[i].money * 1.0 / 100); } return 0; }