トピック `
誰も赤い封筒をつかんでいませんよね…これはN人が赤い封筒を互いに与えて赤い封筒をつかんだ記録です。赤い封筒をつかんだことによる彼らの利益を数えてください。
入力形式:
最初の行を入力して、正の整数N(≤104^ 4)を指定します。つまり、赤い封筒の配布と赤い封筒の取得に参加している人の総数です。これらの人には1からNまでの番号が付けられます。 。次のN行では、i番目の行にiという番号の人が発行した赤い封筒の記録が次の形式で示されています。KN1P1…NK P Kここで、 K(0≤K≤20)は送信された赤い封筒の数です。Niは赤い封筒をつかんだ人の数であり、Pi(> 0)は赤い封筒の量(セント単位)です。注:同じ人が発行した赤い封筒の場合、各人は最大で1回しかそれをつかむことができず、繰り返すことはできません。
出力形式:
各人のシリアル番号と収入額を収入額の降順で出力します(人民元、小数点以下第2位まで出力)。各人の情報は、2つの数字の間にスペースを入れて1行にまとめられています。収入額が同数の場合は、取得した赤い封筒の数に応じて降順で出力され、同数の場合は、個々の数に応じて増分して出力されます。
入力例:
10
3 2 22 10 58 8125
5 1345 3 211 5233 7 13 8101
1 7 8800
2 1 1000 2 1000
2 4250 10320
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
qsort関数は<stdlib.h>の使用法に含まれています
コード:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct peo{
int id;
int fmoney;
int smoney;
double jieguo;
int geshu;
};
int cmp(const void *a,const void *b){
struct peo s1 = *(struct peo*)a;
struct peo s2 = *(struct peo*)b;
if(s1.jieguo<s2.jieguo){
return 1;
}else if(s1.jieguo==s2.jieguo){
if(s1.geshu<s2.geshu){
return 1;
}else if(s1.geshu==s2.geshu){
if(s1.id>s2.id){
return 1;
}else if(s1.id==s2.id){
return 0;
}else{
return -1;
}
}else{
return -1;
}
}else{
return -1;
}
}
int main(int argc, char *argv[]) {
int i,j,n,m,a,b;
scanf("%d",&n);
struct peo p[10005] = {
0};
for(i=0;i<n;i++){
scanf("%d",&m); //发的红包个数
p[i].id = i+1;
for(j=0;j<m;j++){
scanf("%d%d",&a,&b); //a抢红包的人,b抢到的钱
p[a-1].smoney += b;
p[a-1].geshu++;
p[i].fmoney += b;
}
}
for(i=0;i<n;i++){
p[i].jieguo = p[i].smoney - p[i].fmoney;
}
qsort(p,n,sizeof(struct peo),cmp);
//输出
for(i=0;i<n;i++){
printf("%d %.2lf\n",p[i].id,p[i].jieguo/100);
}
return 0;
}