2019年三峡大学新生编程赛
2.时间排序
(1)题目内容:
出题组的小Y有突然有一天心血来潮想要整理出题组写过的代码,
但是他发现这群人写过太多的代码啦,分类整理的时候弄得他很头秃,所以他一不做二不休的选择了—— 放弃!
是不可能的放弃的, 这里个个都是人才,说话又好听,超喜欢这里的,所以他是不会放弃帮大家整理代码的!
所以他选择了最划水的一种方式, 用时间排序!
他整理出来了每一个代码的最后修改时间, 打算将它们从小到大进行排序
时间的格式是 year/month/day-hour.minute.second
分别代表 年,月,日,小时,分钟,秒
年月日之间用’/‘字符分隔,日和小时之间用’-‘字符分隔,小时,分钟,秒之间用’.'分隔
(2)输入描述
第一行一个n,代表要排序的时间有n个
接下来有n行,每行一个字符串代表要排序的时间(时间都是合法的)
其中 1<=n<=1000, 1<=year<=9999, 1<=month<=12, 1<=day<=28, 0<=hour<24, 0<=minute<60, 0<=second<60。
(3)输出描述
输出有n行,分别是排好序的时间
(4)输入样例1
6
2019/11/13-21.5.56
2019/11/15-20.59.56
2019/11/15-19.59.56
2018/1/1-0.0.0
2018/1/1-0.0.0
2018/1/1-0.0.1
(5)输出样例1
2018/1/1-0.0.0
2018/1/1-0.0.0
2018/1/1-0.0.1
2019/11/13-21.5.56
2019/11/15-19.59.56
2019/11/15-20.59.56
(6)限制条件
JAVA 运行时间 2000ms 运行内存 524288kb
C++ 运行时间 1000ms 运行内存 262144kb
(7)程序代码
#include<stdio.h>
struct sj{
int a,b,c,d,e,f;
};
struct sj s[1005];
int main()
{
char A,B,C,D,E;
int x,y,i,j;
scanf("%d",&x);
for(i=0;i<x;i++)
scanf("%d%c%d%c%d%c%d%c%d%c%d",&s[i].a,&A,&s[i].b,&B,&s[i].c,&C,&s[i].d,&D,&s[i].e,&E,&s[i].f);
for(i=1;i<x;i++)
for(j=0;j<x-i;j++)
{
if(s[j].a>s[j+1].a)
{
s[1005]=s[j];
s[j]=s[j+1];
s[j+1]=s[1005];
}
if(s[j].a==s[j+1].a)
{
if(s[j].b>s[j+1].b)
{
s[1005]=s[j];
s[j]=s[j+1];
s[j+1]=s[1005];
}
if(s[j].b==s[j+1].b)
{
if(s[j].c>s[j+1].c)
{
s[1005]=s[j];
s[j]=s[j+1];
s[j+1]=s[1005];
}
if(s[j].c==s[j+1].c)
{
if(s[j].d>s[j+1].d)
{
s[1005]=s[j];
s[j]=s[j+1];
s[j+1]=s[1005];
}
if(s[j].d==s[j+1].d)
{
if(s[j].e>s[j+1].e)
{
s[1005]=s[j];
s[j]=s[j+1];
s[j+1]=s[1005];
}
if(s[j].e==s[j+1].e)
{
if(s[j].f>s[j+1].f)
{
s[1005]=s[j];
s[j]=s[j+1];
s[j+1]=s[1005];
}
}
}
}
}
}
}
for(i=0;i<x;i++)
printf("%d%c%d%c%d%c%d%c%d%c%d\n",s[i].a,A,s[i].b,B,s[i].c,C,s[i].d,D,s[i].e,E,s[i].f);
return 0;
}
(8)解题思路以及题目分析
本题考查的时间排序涉及到的是对几组数据的排序,小的在前,大的在后,上述代码选取的是最基础的冒泡排序,本题另外一个难点在于数据的输入,由于存在“/”与“-”等符号与数据交替,于是选择如上图所示输入方法,然后逐步进行大小判断,再进行结构体元素交换,最后输出。
(9)题目总结
此题难度较小,但大小比较和数据交换较为复杂,重点在于数据的输入。
至于多种排序方法,分享一个链接。
链接: http://wenku.cyjzzd.com/a/137197.