irpas技术客

【GPLT 二阶题目集】L2-009 抢红包_花辞树dor

大大的周 921

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

输入格式:

输出格式:

按照收入金额从高到低的递减顺序输出每个人的编号和收入金额(以元为单位,输出小数点后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> using namespace std; class Person { public: int name; int counts; int money; Person() { counts = money = 0; //自动初始化金额和红包个数 } }; bool cmp(Person a, Person b) { if (a.money != b.money) return a.money > b.money; else if (a.counts != b.counts) return a.counts > b.counts; else return a.name < b.name; } int main() { int n, k; cin >> n; int id, red; Person* person; person = new Person[n + 1]; for (int i = 1; i <= n; i++) { person[i].name = i; cin >> k; //编号为i的人发k个红包 while (k--) { cin >> id >> red; person[id].money += red; //抢红包的人金额和红包个数增加 person[id].counts++; person[i].money -= red; //发红包的人金额减少 } } sort(person + 1, person + n + 1, cmp);//根据要求排序,注意进行排序的下标区间是[1,n+1) for (int i = 1; i <= n; i++) { printf("%d %.2f\n",person[i].name,person[i].money*1.0/100); //cout << person[i].name << " " << person[i].money * 1.0 / 100 << endl; } return 0; } ?注意事项:

最后输出结果的时候,要注意题目要求的“输出小数点后2位”,建议使用printf函数。

虽然不知道为什么vs2022用cout输出结果确实是保留两位小数,但是直接提交的话所有测试点均答案错误。

如有问题,欢迎提出。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #GPLT #二阶题目集L2009 #抢红包 #没有人没抢过红包吧