PTA 抢红包 VC6 通过

                                                                         7-9 抢红包 (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

 平时写代码很少用qsort,这一次写代码用的VC6,所以学习了一下C语言版本的排序函数,也发现了很多错误,今天收获颇多。

---->传送门 学习qsort的链接,个人觉得写的很好,很受益

 

 AC代码

#include 
#include 
#include 
 struct red{
  int sno;
  int cnt;
  int money;
}m[11100];
int cmp(const void *a,const void *b)
{
   /* qsort错误的排序方法 
   if( ((*(struct red *)a).money) == ((*(struct red *)b).money) )
   {
      if( (*(struct red *)a).cnt == (* (struct red *)b).cnt  )
	  {
	      return (*(struct red *)a).sno < (*(struct red *)b).sno;
	  }
	  else{
	     return (*(struct red *)a).cnt > (*(struct red *)b).cnt;
	  }
   }
   else{
        return (*(struct red *)a).money > (*(struct red *)b).money;
   }*/
  
   if( ((*(struct red *)a).money) < ((*(struct red *)b).money) ||
	   (((*(struct red *)a).money) == ((*(struct red *)b).money)) &&
       ((*(struct red *)a).cnt < (*(struct red *)b).cnt) ||
	   (((*(struct red *)a).money) == ((*(struct red *)b).money))&&
       (( (*(struct red *)a).cnt == (* (struct red *)b).cnt  ))&&
       ( (*(struct red *)a).sno > (*(struct red *)b).sno)
	   )
   {
    return 1;
   }else{
    return -1;
   }
}
int main(){
int n;
int k,a,p,i,j;
double x;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
   m[i].cnt=0;
   m[i].money=0;
}
for(i=1;i<=n;i++){
m[i].sno=i;
 scanf("%d",&k);
 for(j=1;j<=k;j++)
 {
   scanf("%d %d",&a,&p);
   m[a].money=m[a].money+p;
   m[a].cnt=m[a].cnt+1;
   m[i].money=m[i].money-p;
 }
}
 qsort(m+1,n,sizeof(struct red),cmp); //C语言排序函数用qsort
 for(i=1;i<=n;i++)
 {
	 printf("%d ",m[i].sno);
	 printf("%.2lf\n",(double)m[i].money/100);
 }

}

 

 

 

 

 

 

你可能感兴趣的:(CCCC天梯赛)