2 条题解
-
1
首先可以看到 @ 的题解,是否感到不理解?这里有更简单的方案
这道题是一种排序,排序过程中需要让两个数据“绑”在一块,可能需要 int nums[n][2] (同时交换),或者struct结构体,或者pair之类的
在你思考怎么处理两个日期之间的关系的时候不难发现,咱们可以让月份和号这两个数据合并在一起,如何呢?
点击展开提示
时间戳=月份*100+号
然后直接排序时间戳即可,再拆开即可(通过/100和%100)
cpp
const int N=1e6+10; int t[N]; void eachT() { //读取 int n,x,y; cin>>n; for(int i=1;i<=n;++i){ cin>>x>>y; t[i]=x*100+y; } //提示:编辑区 ctrl+/ 可以取消注释 //cpp排序 // sort(t+1,t+1+n); //冒泡排序 // for(int i=1;i<=n;++i) // for(int j=1;j<=n-i;++j) // if(t[j]>t[j+1]) // swap(t[j],t[j+1]); //输出 for(int i=1;i<=n;++i){ cout<<t[i]/100<<" "<<t[i]%100<<endl; } } -
-1
方法思路
定义结构体:创建 Schedule 结构体,包含日期 x 和时间 y。
读取输入:先读取日程数量 n,再读取 n 条日程的日期和时间。
排序:使用 qsort 函数对日程数组排序,排序规则为:
若日期不同,按日期升序排列;
若日期相同,按时间升序排列。
输出结果:遍历排序后的数组,输出每条日程的日期和时间。#include <stdio.h> #include <stdlib.h> // 定义日程结构体:包含日期x和时间y typedef struct { int x; int y; } Schedule; // qsort的比较函数:先按x升序,x相同时按y升序 int compare(const void *a, const void *b) { Schedule *s1 = (Schedule *)a; Schedule *s2 = (Schedule *)b; if (s1->x != s2->x) { return s1->x - s2->x; // 日期不同,返回日期差(升序) } else { return s1->y - s2->y; // 日期相同,返回时间差(升序) } } int main() { int n; scanf("%d", &n); // 读取日程数量 Schedule schedules[100]; // 存储最多100条日程(题目中n≤100) // 读取每条日程的日期和时间 for (int i = 0; i < n; ++i) { scanf("%d %d", &schedules[i].x, &schedules[i].y); } // 对日程数组进行排序 qsort(schedules, n, sizeof(Schedule), compare); // 输出排序后的日程 for (int i = 0; i < n; ++i) { printf("%d %d\n", schedules[i].x, schedules[i].y); } return 0; }
- 1
信息
- ID
- 618
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 24
- 已通过
- 6
- 上传者