L2-009 抢红包
Statement
Metadata
- 作者: 陈越
- 单位: 浙江大学
- 代码长度限制: 16 KB
- 时间限制: 300 ms
- 内存限制: 64 MB
没有人没抢过红包吧…… 这里给出
输入格式
输入第一行给出一个正整数
其中
输出格式
按照收入金额从高到低的递减顺序输出每个人的编号和收入金额(以元为单位,输出小数点后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
输出样例
Solution
#include <ctype.h>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long LL;
const double PI = 3.14159265358979323846264338327;
const double E = 2.718281828459;
const double eps = 1e-6;
const int MAXN = 0x3f3f3f3f;
const int MINN = 0xc0c0c0c0;
const int maxn = 1e4 + 5;
const int MOD = 1e9 + 7;
struct Node {
int tot, id;
double sum;
} q[maxn];
bool comp(Node x, Node y) {
if (x.sum == y.sum) {
if (x.tot == y.tot)
return x.id < y.id;
return x.tot > y.tot;
}
return x.sum > y.sum;
}
int main() {
memset(q, 0, sizeof(q));
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) q[i].id = i;
for (int i = 0; i < n; i++) {
int k;
scanf("%d", &k);
int id, num;
for (int j = 0; j < k; j++) {
scanf("%d%d", &id, &num);
q[id - 1].sum += num;
q[id - 1].tot++;
q[i].sum -= num;
}
}
sort(q, q + n, comp);
for (int i = 0; i < n; i++) printf("%d %.2lf\n", q[i].id + 1, q[i].sum / 100);
}
Last update: May 4, 2022