codevs 3911 QQ价值

题目描述 Description

现在的年轻人都有自己的QQ号码,但是每个人的QQ号码不同,因此所产生的QQ“价值”也不同。已知道QQ号码的“价值”是由QQ号码的位数和构成数字大小所决定的。也就是说,QQ号码长度越小,“价值”越大。构成数字越大,“价值”越大。我们规定:

一个QQ号码的“价值”=(各位数字之和*P(P>0)/QQ号码位数)向下取整

例如:QQ号码 123456 的“价值”为 (1+2+3+4+5+6)*P/6 向下取整

      QQ号码 1212121 的“价值”为(1+2+1+2+1+2+1)*P/7 向下取整

输入描述 Input Description

第一行输入整数N,P;

接下来的2N行分别输入每个人的名字和QQ号码(名字和QQ号各占一行)

输出描述 Output Description

按QQ“价值”由大到小输出名字,(若“价值”相同,按字典序输出)

样例输入 Sample Input

3 10

Drew

1164371383

Adam

1324432934

Kyle

578507419

样例输出 Sample Output

Kyle

Drew

Adam

数据范围及提示 Data Size & Hint

0<N<=10000

0<P<=20

保证名字长度<500

保证QQ号码超度<400

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,p,tot;
struct node
{
    char name[501];
    int sum;
}a[10001];
bool cmp(const node &x,const node &y)
{
    if(x.sum!=y.sum)
        return x.sum>y.sum;
    else 
      if(strcmp(x.name,y.name)>0) //如果价值相同,按字典序排序
        return 0;
      else 
        return 1;
}
int read()
{
    int ans=0;
    char x=getchar();
    while(x>'9'||x<'0')
      x=getchar();
    while(x<='9'&&x>='0')
      ans+=(x-'0'),tot++,x=getchar();
    return ans;
}
int main()
{
    int i,j;
    scanf("%d%d",&n,&p);
    for(i=1;i<=n;i++)
    {
        scanf("%s",a[i].name);
        tot=0;
        a[i].sum=read()*p/tot;
    }
    sort(a+1,a+n+1,cmp);
    for(i=1;i<=n;i++)
      printf("%s
",a[i].name);
    return 0;
}
原文地址:https://www.cnblogs.com/jyhywh/p/6042390.html