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\n",a[i].name); return 0; }