题目大意
给你 nnn 个长度为 mmm 的数组和一个只能为 000 或者 111 的整数 kkk。要求你同时对所有数组进行最多 m×(m−1)2\frac {m \times (m-1)}{2}2m×(m−1) 次交换操作使得所有数组按题目要求的升序或者降序排序好。
当 kkk 为 000 时,数组必须按升序排序,否则必须按降序排序。
进行交换操作时选择两个位置 iii 和 jjj,只有当位置 iii 的值严格大于位置 jjj 的值时,才会交换两者位置。
思路
因为这道题并不需要求最小步数,只要在限定步数之内即可。那我们可以想到一个不是最优步数的做法。那就是每次交换相邻两个数字,这样做的话不仅可以保证排序结束后数组一定有序,且不会超出步数限制。但是需要注意的是升序和降序数字交换的前后顺序是不一样的。
代码
#include<bits/stdc++.h>
#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define ll long long
#define lhs printf("\n");
using namespace std;
const int N=1e5+10;
const int M=2024;
const int inf=0x3f3f3f3f;
int n,m,k;
int a;
int ans;
int main()
{
scanf("%d%d%d",&n,&m,&k);
//这道题和n没关系,只和m,k有关系。
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a);
}
}
printf("%d\n",m*(m-1)/2);//直接输出
//注意顺序
if(!k)
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m-i;j++)
{
printf("%d %d\n",j,j+1);
}
}
}
else
{
for(int i=1;i<=m;i++)
{
for(int j=m;j>=i+1;j--)
{
printf("%d %d\n",j,j-1);
}
}
}
return 0;
}