题解:CF384B Multitasking

题目大意

给你 nnn 个长度为 mmm 的数组和一个只能为 000 或者 111 的整数 kkk。要求你同时对所有数组进行最多 m×(m−1)2\frac {m \times (m-1)}{2}2m×(m1) 次交换操作使得所有数组按题目要求的升序或者降序排序好。

kkk000 时,数组必须按升序排序,否则必须按降序排序。

进行交换操作时选择两个位置 iiijjj,只有当位置 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值