题目大意
给你 n n n 个长度为 m m m 的数组和一个只能为 0 0 0 或者 1 1 1 的整数 k k k。要求你同时对所有数组进行最多 m × ( m − 1 ) 2 \frac {m \times (m-1)}{2} 2m×(m−1) 次交换操作使得所有数组按题目要求的升序或者降序排序好。
当 k k k 为 0 0 0 时,数组必须按升序排序,否则必须按降序排序。
进行交换操作时选择两个位置 i i i 和 j j j,只有当位置 i i i 的值严格大于位置 j j j 的值时,才会交换两者位置。
思路
因为这道题并不需要求最小步数,只要在限定步数之内即可。那我们可以想到一个不是最优步数的做法。那就是每次交换相邻两个数字,这样做的话不仅可以保证排序结束后数组一定有序,且不会超出步数限制。但是需要注意的是升序和降序数字交换的前后顺序是不一样的。
代码
#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;
}