Codeforces 1294E Obtain a Permutation
Description
描述
给一个 的矩阵,你想要把它还原成如下的矩阵:
你有两种操作:
- 选择一个数,修改它的值。
- 选择一列,每个元素上移一位,第一行的元素移到第 行。
求还原的最小操作次数。
输入
第一行两个正整数 (,)。
接下来是一个 的矩阵 ()。
输出
一个数表示答案。
样例
输入1
3 3
3 2 1
1 2 3
4 5 6输出1
6
输入2
4 3
1 2 3
4 5 6
7 8 9
10 11 12输出2
0
输入3
3 4
1 6 3 4
5 10 7 8
9 2 11 12输出3
2
解释
样例1:,,,然后每列上移一次。
样例2:矩阵已经还原。
样例3:上移第 列 次。
Solution
先观察一下两种操作:
- 单点修改
- 整列上移
发现了什么?不同列之间互不影响,所以我们可以对于每一列分开处理。
那么,对于一列 ,因为“先修改,后上移”和“先上移,后修改”没有本质区别,所以我们定义 ()表示将第 列上移 个单位后,有几个数是不用变的。那么上移了 个单位以后,自然还有 个数是需要变的,那么就要花费 次修改操作,上移也花费了 次操作,那第 列的最优方案就是 ,最终答案就是:
现在唯一的问题就是如何求出 了。我们发现,如果一个数 是 应该出现在第 列 的数字,那么一定有 ,同时 (后者在代码里写作了 (a[i][j] - j) % m )。
如果上面的条件满足了,那我们就可以算一下 这个数字应该出现在哪一行。显然,它应该出现在 行(记作 )。
那如果我们把 移到第 行,它就不用变了。回顾 的定义,从第 行移到第 行,要移动几次呢?
- 如果 ,移动 个单位即可;
- 如果 ,那首先把它移到第 行需要 次,然后再移 次到第 行,从第 行移到第 行需要 次,加起来,就是 ,化简得 。
如果合并的话,就是要移动 次,那么我们就可以把 增加 了。
注意 都有可能达到 ,所以需要开不定长数组,时间复杂度 。 可以每列重复使用,舍去前一个维度。
代码贴出,仅供参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <bits/stdc++.h> using namespace std; const int NM = 2e5 + 5; int n, m, same[NM], ans; vector< int > a[NM]; int main() { ios::sync_with_stdio( false ); cin >> n >> m; for ( int i = 1; i <= n; i++) { a[i].push_back(0); // 下标凑成从 1 开始 for ( int j = 1; j <= m; j++) { int val; cin >> val; a[i].push_back(val); } } for ( int j = 1; j <= m; j++) { int tans = INT_MAX; for ( int i = 0; i < n; i++) same[i] = 0; for ( int i = 1; i <= n; i++) { if (a[i][j] < j || a[i][j] > n * m || (a[i][j] - j) % m != 0) continue ; int k = (a[i][j] - j) / m + 1; same[(i - k + n) % n]++; } for ( int i = 0; i < n; i++) tans = min(tans, i + n - same[i]); ans += tans; } cout << ans << endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探