沒有人沒搶過紅包吧…… 這里給出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
代碼如下:
#include <bits/stdc++.h>
using namespace std;
struct person {
int id; //編號
int get; //收入金額
int count; //搶到的紅包數
} p[10001];
bool cmp(person a, person b) { //合理利用sort函式,真的好用!!
if(a.get != b.get) { //按照收入金額從高到低排序
return a.get > b.get;
}
if(a.count != b.count) { //收入金額有并列,則按搶到紅包的個數從高到低排序
return a.count > b.count;
}
return a.id < b.id; //如果還有并列,則按個人編號從小到大排序
}
int main() {
int n, k, id, money, send[10001] = {0};
cin >> n;
for(int i = 1; i <= n; i++) { //注意是從1到N編號
p[i].id = i, p[i].get = 0, p[i].count = 0;
}
for(int i = 1; i <= n; i++) {
cin >> k;
for(int j = 1; j <= k; j++) {
cin >> id >> money;
p[id].get += money, p[id].count++;
send[i] += money; //發出去的金額累加
}
}
for(int i = 1; i <= n; i++) {
p[i].get -= send[i]; //搶到的錢減去發出去的錢
}
sort(p+1, p+n+1, cmp); //因為編號從1開始
for(int i = 1; i <= n; i++) {
printf("%d %.2f\n", p[i].id, p[i].get/100.0); //注意搶到的紅包金額是以分為單位的!!
}
return 0;
}
👀 心得:
千萬別被冗長的輸入樣例嚇到了,認真看一下題目要求就會發現該題并沒有乍一看那么難~
還有 sort函式是真的好用!!!
對c++標準庫里的排序函式的使用還不太清楚不太熟練的小伙伴可以參考這里:
https://www.cnblogs.com/epep/p/10959627.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248515.html
標籤:其他
下一篇:Problem I: 挖寶游戲
