题目描述
cjf君想调查学校OI组每个同学的生日,并按照从大到小的顺序排序。但cjf君最近作业很多,没有时间,所以请你帮她排序。
输入输出格式
输入格式:
有2行,第1行为OI组总人数n;第2行至第n+1行分别是每人的姓名s、出生年y、月m、日d。
输出格式:
有n行,即n个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
输入输出样例
输入样例#1:
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
输出样例#1:
Luowen
Yangchu
Qiujingya
说明
数据规模
1<n<100
length(s)<20
算法:
排序
分析:
这道题讲了要我们把n个人的生日按从老到幼排个序,然后要注意一点,就是后输入(编号大的人)算更老。
这道题很水,用简单的排序就可以解决。
C++的STL这是非常好用,自己写个comp函数再套用sort就可以了。Comp函数假如三目运算符写得很晕的话直接用if就可以了。
另外,吐槽一下ccf的Guide,虽然可以编译Pascal/c/c++的程序,但是没有括号匹配,奇怪的换行,函数的搭配。今天不知道为什么作死用了一下,下次还是用Dev好。
上代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int n; 8 struct node 9 { 10 char s[25]; //名字 11 int no,y,m,d; //编号,年,月,日 12 }a[110]; 13 14 inline int read() //读入优化 15 { 16 int x=0,f=1; 17 char c=getchar(); 18 while (c<48||c>57) 19 f=c=='-'?-1:1,c=getchar(); 20 while (c>=48&&c<=57) 21 x=(x<<1)+(x<<3)+(c^48),c=getchar(); 22 return x*f; 23 } 24 25 inline bool comp(const node &a,const node &b) //比较函数 26 { 27 if (a.y<b.y) //小的或者大的就直接返回值, 28 return 1; //否则就代表这一项相等 29 if (a.y>b.y) 30 return 0; 31 if (a.m<b.m) 32 return 1; 33 if (a.m>b.m) 34 return 0; 35 if (a.d<b.d) 36 return 1; 37 if (a.d>b.d) 38 return 0; 39 return a.no>b.no; //最后判断同一天的情况 40 } 41 42 int main() 43 { 44 int i; 45 n=read(); 46 for (i=1;i<=n;i++) 47 { 48 scanf("%s",a[i].s); 49 a[i].y=read(); 50 a[i].m=read(); 51 a[i].d=read(); 52 a[i].no=i; //记录编号 53 } 54 sort(a+1,a+n+1,comp); 55 for (i=1;i<=n;i++) 56 puts(a[i].s); //puts可以直接输出内容加换行,比printf快 57 return 0; 58 }
嗯,就这样了。