牛客竞赛技巧
题目:https://ac.nowcoder.com/acm/problem/15056#include <stdio.h>
#include <algorithm>
typedef struct time
{
int hour;
int second;
int minute;
}Time;
int cmp(Time t1,Time t2 )
{
if(t1.hour!=t2.hour)
return t1.hour<t2.hour;
else
{
if(t1.minute!=t2.minute)
return t1.minute<t2.minute;
else
return t1.second<t2.second;
}
}
int main()
{
int n;
scanf("%d",&n);
Time t;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&t.hour,&t.minute,&t.second);
}
std::sort(t,t+n,cmp);
for(int i=0;i<n;i++)
{
printf("%d %d %d\n",t.hour,t.minute,t.second);
}
return 0;
}
由于还没有学结构体,可以给一下注释吗,再顺便写一下其他解法,谢谢大佬 这段代码定义了一个结构体Time,包含了时(hour)、分(minute)、秒(second)三个成员变量。然后定义了一个cmp函数,用于排序,按照时、分、秒的顺序进行排序。在主函数中,先输入n个时间,再用sort函数进行排序,最后输出排序后的时间。
除了使用结构体,还可以使用pair来存储时间,然后按照pair的第一个元素和第二个元素进行排序,具体代码如下:
#include <cstdio>
#include <algorithm>
#include <utility>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
pair<pair<int, int>, int> a;
for(int i = 0; i < n; i++)
{
scanf("%d%d%d", &a[ i].first.first, &a[ i].first.second, &a[ i].second);
}
sort(a, a + n);
for(int i = 0; i < n; i++)
{
printf("%d %d %d\n", a[ i].first.first, a[ i].first.second, a[ i].second);
}
return 0;
}
此外,还可以使用结构体的比较运算符重载来进行排序,具体代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
struct Time
{
int hour, minute, second;
bool operator < (const Time &t) const
{
if(hour != t.hour) return hour < t.hour;
if(minute != t.minute) return minute < t.minute;
return second < t.second;
}
};
int main()
{
int n;
scanf("%d", &n);
Time a;
for(int i = 0; i < n; i++)
{
scanf("%d%d%d", &a[ i].hour, &a[ i].minute, &a[ i].second);
}
sort(a, a + n);
for(int i = 0; i < n; i++)
{
printf("%d %d %d\n", a[ i].hour, a[ i].minute, a[ i].second);
}
return 0;
}
解题思路:
首先,给出的代码使用了结构体Time来表示时间,结构体中包含了时、分、秒三个成员变量。然后,使用std::sort函数对时间数组进行排序,排序的依据是自定义的cmp比较函数。
在cmp函数中,首先比较两个时间的时,如果不相等则按照小时升序排序,相等则继续比较分钟,再相等则比较秒。这样可以保证整个数组按照时间升序排列。
最后,遍历排序后的数组,按照格式输出时间。
由于你没有学习结构体,我可以给你提供两种改进的解法:
解法一:使用二维数组存储时间
#include <stdio.h>
#include <algorithm>
int main() {
int n;
scanf("%d", &n);
int t; // 使用二维数组存储时间
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &t, &t, &t);
}
std::sort(t, t + n); // 直接使用默认的升序排序
for (int i = 0; i < n; i++) {
printf("%d %d %d\n", t, t, t);
}
return 0;
}
解法二:使用三个数组分别存储时、分、秒
#include <stdio.h>
#include <algorithm>
int main() {
int n;
scanf("%d", &n);
int hour, minute, second; // 使用三个数组分别存储时、分、秒
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &hour, &minute, &second);
}
// 使用自定义的比较函数cmp进行排序
std::sort(hour, hour + n);
std::sort(minute, minute + n);
std::sort(second, second + n);
for (int i = 0; i < n; i++) {
printf("%d %d %d\n", hour, minute, second);
}
return 0;
}
以上是两种改进的解法,分别使用二维数组和三个数组来存储时间,并且使用默认的升序排序或分别对时、分、秒进行排序。希望对你有帮助!如果你还有其他问题,请随时提出。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]