题目描述:
一些人在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 }