Week2实验 B--爆零(❌)大力出奇迹(√) HDU

题目描述:

一些人在OJ上做题,给他们排名次。按AC题目数,罚时数,名字来排序

样例输入:

TT        120(3) 30    10(1) -3   0    47     21(2) -2
OMRailgun 0      -99   -8    0    -666 -10086 0     -9999996

思路和总结:

主要是细节问题

1、scanf可以直接按格式读入: scanf("%d(%d)",&x,&y)

2、简单的if-else表达式可以用三目运算符代替,但是要注意加括号,因为优先级很迷,能节省代码量

3、字符数组不能直接比较大小,可用string类,如此:strcpy(s,st.data()) 可把string对象st转换成字符数组s,或者是输出时直接用:st.c_str()。string.c_str()返回一个const char*

4、scanf以%s读入时,即使缓冲区有空格和回车,也会直接忽略,直到遇到一个正常字符

5、scanf以%d读入读到字符时,会停止返回0,而不是继续向后,比如scanf("%d",&a) 输入:a ,返回0,读入结束。

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <iomanip>
 7 using namespace std;
 8 
 9 struct stu
10 {
11     string name;
12     int num;
13     int time;
14     bool operator < (const stu &a) const
15     {
16         if(num!=a.num) return num>a.num;
17         else if(time!=a.time) return time<a.time;
18         else return name<a.name; 
19     }
20 };
21 
22 stu a[100005];
23 int main()
24 {
25     //freopen("a.in","r",stdin);
26     int n,m;
27     cin>>n>>m;
28     char s[100]={0};
29     int tot=0;
30     while( ~scanf("%s",s) )
31     {
32         tot++;
33         a[tot].name=s;
34         int num=0,time=0;
35         int t1,t2;
36         for(int i=1;i<=n;i++)
37         {
38             if( scanf("%d(%d)",&t1,&t2)==1 )  //这步是很妙的
39                 num+= (t1>0) , time+= (t1>0) ? t1:0;  //这一步更绝妙 特别是num
40             else
41             {
42                 num++;
43                 time+=t1+t2*m;
44             }
45         }
46         a[tot].num=num; a[tot].time=time;    
47     }
48     sort(a+1,a+tot+1);
49     for(int i=1;i<=tot;i++)
50     {
51         char c[100]={0};
52         strcpy(c,a[i].name.data());
53         printf("%-10s %2d %4d
",c,a[i].num,a[i].time);    
54     }
55 }
原文地址:https://www.cnblogs.com/qingoba/p/12420652.html