欢乐赛T5题解(时间击败100%)
2025-08-26 21:15:58
发布于:广东
9阅读
0回复
0点赞
题目大意
给定一个的矩阵,将这个矩阵的每一列按上小下大的顺序排序,不需要排序0
解题思路
想办法拆分每一列,然后排序即可
具体代码
比赛时我很怕提交次数多导致名次靠后,为了避免TLE增加提交次数,我使用了归并排序和特殊的读入方法,但似乎并没有什么作用,反而是慢了,比赛后发现我没开快读 : (
这是改进后的代码:
#include <bits/stdc++.h>
using namespace std;
int a[114][114], tmp[114];
int n, m;
void sort(int l, int r, int x){ //归并排序函数
if(l==r) return; //仅剩余一个元素,无需分割和排序
int mid=l+r>>1; //分割
sort(l, mid, x);
sort(mid+1, r, x);
int i=l, j=mid+1; //合并
int index = l-1;
while(i<=mid&&j<=r){
if(a[i][x]<a[j][x]) tmp[++index]=a[i++][x];
else tmp[++index]=a[j++][x];
}
while(i<=mid) tmp[++index]=a[i++][x];
while(j<=r) tmp[++index]=a[j++][x];
for(int i=l;i<=r;++i)
a[i][x]=tmp[i];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> n >> m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{ cin >> a[j][i]; if(a[j][i]==0) a[j][i]=INT_MAX; } //行列倒转并特殊处理0,让学生们横着排,逻辑就清晰了
for(int i=1;i<=m;++i)
sort(a[i]+1, a[i]+1+n);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(a[j][i]==INT_MAX) cout << setw(4) << 0; //特殊处理0
else cout << setw(4) << a[j][i];
}
cout << endl;
}
}
这里空空如也
有帮助,赞一个