L2-009. 抢红包
时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
没有人没抢过红包吧…… 这里给出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
直接用一个结构体数组存取信息就行了,但是有几个问题:
1.double不能作比较,在写cmp函数的时候还是要比较total,所以先把total定义int型,最后强转。
2.这里出现了玄学的问题,结构体数组定义在main的时候,如果不用memset初始化,数组开到10000,最后一个测试点过不了,如果把数组开到100000,就全A了,或者把结构体数组定义在全局main方法之外,也可全A,或者定义在main之内,用memset初始化,也可A。关键就是在没有初始化,结构体里面值是随机的也可以理解,但在数组多开一个0为什么也能A的情况就不懂了?
#include <bits/stdc++.h> using namespace std; const int maxn = 10000 + 5; struct Member { int shou; int fa; int total; int num; int id; }; //double ans[maxn]; bool cmp(Member m1,Member m2) { if(m1.total != m2.total) { return m1.total > m2.total; } else if(m1.num != m2.num) { return m1.num > m2.num; } else { return m1.id < m2.id; } } int main() { //freopen("in.txt","r",stdin); Member m[maxn]; int n; memset(m,0,sizeof(m)); cin>>n; for(int i = 0; i < n; i++) { m[i].id = i; } int k,d,mon; for(int i = 0; i < n; i++) { cin>>k; int sum = 0; while(k--) { cin>>d>>mon; m[d-1].shou += mon; sum += mon; m[d-1].num++; } m[i].fa += sum; } for(int i = 0; i < n; i++) { m[i].total = m[i].shou - m[i].fa; } sort(m,m+n,cmp); for(int i = 0; i < n; i++) { // ans[i] = (double)m[i].total/100.0; printf("%d %.2lf ",m[i].id+1,(double)m[i].total/100); } return 0; }