输入样例:
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
这道题学到的知识就是sort里,怎么在第一个关键字排序的基础上,进行第二个关键字的排序。
#include<bits/stdc++.h> using namespace std; struct node { int number; double money; int rednum; }peo[10002]; bool cmp(node a,node b)//这里学到了一个新的知识点,两个关键字的排序 { if(a.money==b.money) return a.rednum>b.rednum;//如果获得的钱相等,就按红包个数进行排序 return a.money>b.money;//首先以获得的钱的多少来进行排序 } int main() { int n,k,num; double mon; scanf("%d",&n); for(int i=1;i<=n;i++) { peo[i].number=i;//对每个人进行编号 } for(int i=1;i<=n;i++) { scanf("%d",&k); for(int j=1;j<=k;j++) { cin>>num>>mon; peo[num].money+=mon;//每个人获得多少钱就加多少 peo[num].rednum++; peo[i].money-=mon;//发红包的人要减去自己发出去的钱 } } sort(peo+1,peo+n+1,cmp);//排序 for(int i=1;i<=n;++i) { printf("%d %.2lf\n",peo[i].number,peo[i].money/100); } return 0; }