zoukankan      html  css  js  c++  java
  • 天梯赛 L2-009 抢红包

    题目链接

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

    输入格式:

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

    K N1 P1 ... NK PK

    其中K(0 <= K <= 20)是发出去的红包个数,Ni是抢到红包的人的编号,Pi(> 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
    

    分析:

    这题其实就是一个简单的结构体排序,可能就是难在该题的结构体排序需要按照的排序方式哪里。我们首先应该优先输出最后的到的钱数最多的人,如果有最终钱数相同的话,应该在此基础上优先输出抢到的红包个数较多的人,如果还有相同的话,就应该按照他们本身的序号由小到大输出。额外需要注意的可能有两点,一是最终的到的钱可能有为负数的情况,也就意味着不仅要加上他抢到的红包的钱数,还要减去他发的那个红包的钱数,二就是在每次累加钱的时候不要化为元在累加,直接以分累加最后再化为元,这样的话数据不会有他打的偏差。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<string>
    #include<algorithm>
    #include<math.h>
    #include<map>
    #include<set>
    #include<vector>
    using namespace std;
    struct Node
    {
     int id;//序号 
     double money;//钱数 
     int num; //红包个数 
    }no[10000];
    bool cmb(Node a,Node b)//结构体排序需要遵循的排序方法 
    {
    	if(a.money!=b.money)
    	return a.money>b.money;
    	else
    	if(a.num!=b.num)
    	return a.num>b.num;
    	else
    	return a.id<b.id;
    }
    int main()
    {	 
         int n,m,a;
         double b;
         scanf("%d",&n);
         for(int i=0;i<n;i++)
         {
         	no[i].id=i+1 ;//主要是因为i是从0开始循环的,但是编号是从1开始的 
         	double sum=0.0;
         	scanf("%d",&m);
         	for(int j=0;j<m;j++)
         	{
         		scanf("%d%lf",&a,&b);//编号为a对应的下标应该为a-1 
         		no[a-1].money+=b;
         		no[a-1].num++;
         		sum+= b;
         	}
         	no[i].money-=sum;
         }
         //cout<<"hahahahah"<<endl;
        sort(no,no+n,cmb);
         for(int i=0;i<n;i++)
         printf("%d %.2lf
    ",no[i].id,no[i].money/100);
    	return 0;
    }
  • 相关阅读:
    oracle 数据库服务名怎么查
    vmware vsphere 6.5
    vSphere虚拟化之ESXi的安装及部署
    ArcMap中无法添加ArcGIS Online底图的诊断方法
    ArcGIS中字段计算器(高级计算VBScript、Python)
    Bad habits : Putting NOLOCK everywhere
    Understanding the Impact of NOLOCK and WITH NOLOCK Table Hints in SQL Server
    with(nolock) or (nolock)
    What is “with (nolock)” in SQL Server?
    Changing SQL Server Collation After Installation
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6729713.html
Copyright © 2011-2022 走看看