【CCCC】L2-009 抢红包 (25分),,间接排序,比较double大小

    科技2022-07-11  109

    problem

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

    输入格式: 输入第一行给出一个正整数N(≤10 ​4 ​​ ),即参与发红包和抢红包的总人数,则这些人从1到N编号。随后N行,第i行给出编号为i的人发红包的记录,格式如下:

    KN ​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

    给出n个人(1~n编号),每个人发出的红包,被ki个人分别抢走pi元。统计每个人的输入金额

    solution

    扫一遍模拟一下,然后排个序。注意输出2位小数,不然答案错。注意double比较大小,不然答案错。 #include<bits/stdc++.h> using namespace std; const int maxn = 10010; double a[maxn];int b[maxn];//红包金额和个数 int r[maxn];//间接排序 void init(int n){for(int i = 1; i <= n; i++)r[i]=i;} bool cmp(int x, int y){ if(abs(a[x]-a[y])>0.01)return a[x]>a[y];//a[x]!=a[y],精确到0.01 if(abs(b[x]-b[y])>0.01)return b[x]>b[y]; return x<y; } int main(){ int n; cin>>n; for(int i = 1; i <= n; i++){ int k; cin>>k; for(int j = 1; j <= k; j++){ int ni, pi; cin>>ni>>pi; double py = pi*1.0/100; a[ni] += py; a[i] -= py; b[ni]++; } } init(n); sort(r+1,r+n+1,cmp); for(int i = 1; i <= n; i++) printf("%d %.2lf\n",r[i],a[r[i]]); return 0; }
    Processed: 0.009, SQL: 8