列表排序
列表排序
给定一个 行 列的整数列表。
列表中每一行的 个整数都是一个 的排列。
现在,你可以对该列表执行以下两种操作:
- 选择一行中的两个整数并交换它们。此操作,每行最多只能执行一次。
- 选择列表中的两列并交换它们。此操作,最多只能执行一次。
不难发现,你最多可以进行 次操作,最少可以进行 次操作,所有操作的具体执行顺序随意。
我们的目标是,通过执行上述操作,使得最终列表中每一行的 个整数都能按照 的顺序排列。
请你判断,目标是否能够达成。
输入格式
第一行包含两个整数 。
接下来 行,每行包含 个整数,用来表示整数列表。保证每行的 个整数都是一个 的排列。
输出格式
如果目标能够达成,则输出 YES ,否则输出 NO 。
数据范围
前 个测试点满足 。
所有测试点满足 。
输入样例1:
1 2 4 2 1 3 2 4 3 1 3 4 2
输出样例1:
YES
输入样例2:
4 4 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3
输出样例2:
NO
输入样例3:
3 6 2 1 3 4 5 6 1 2 4 3 5 6 1 2 3 4 6 5
输出样例3:
YES
解题思路
当时比赛时这题想了好久,花了快半个钟才AC了。比赛时候的思路是,因为每一行中交换两个数的操作只有一次,再加上只有一次的两列互换操作,因此每一行中最多只能交换两次数字。然后又想到交换两列是对所有行都产生影响,数据范围也很小,因此想到先枚举交换哪两列,然后再判断每一行能否只用不超过一次的操作使得这行变升序序列。
下面是y总的思路。如果只有第一种操作而没有第二种操作,意味着每行最多只交换一次,交换完后变成的排列。如何判断序列能否最多交换一次变成升序呢,将当前序列与的排列进行对比,看看有几个位置不一样。如果恰好只有两个位置不一样,那么只需要交换这两个不一样的位置就可以变成升序序列了。而如果不同的位置超过两个,因为一次交换最多改变两个位置,因此必然不能只通过一次操作变成升序序列。
如果加上第二种操作就不好处理。但可以发现数据范围很小,第二种操作只有种(是指不交换的情况),因此可以枚举一下第二种操作,然后用上面的方法判断每一行。列操作与每行间的操作的执行先后顺序不影响结果。
AC代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 30; 5 6 int n, m; 7 int g[N][N]; 8 9 bool check() { 10 for (int i = 1; i <= n; i++) { 11 int cnt = 0; 12 for (int j = 1; j <= m; j++) { 13 if (g[i][j] != j) cnt++; 14 } 15 if (cnt > 2) return false; 16 } 17 18 return true; 19 } 20 21 int main() { 22 scanf("%d %d", &n, &m); 23 for (int i = 1; i <= n; i++) { 24 for (int j = 1; j <= m; j++) { 25 scanf("%d", &g[i][j]); 26 } 27 } 28 29 for (int i = 1; i <= m; i++) { 30 for (int j = 1; j <= i; j++) { // j == i 表示不交换两列的情况 31 for (int k = 1; k <= n; k++) { 32 swap(g[k][i], g[k][j]); 33 } 34 if (check()) { 35 printf("YES"); 36 return 0; 37 } 38 for (int k = 1; k <= n; k++) { 39 swap(g[k][i], g[k][j]); 40 } 41 } 42 } 43 44 printf("NO"); 45 46 return 0; 47 }
参考资料
AcWing 4610. 列表排序(AcWing杯 - 周赛):https://www.acwing.com/video/4298/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/16654270.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效