1 条题解
-
0
解题思路
- 输入处理:
- 读取测试用例的数量
nc。 - 对于每个测试用例,读取数组的长度
n。 - 读取数组
a的元素,同时在数组b中记录每个元素a[i]在原数组中的下标i(即b[a[i]] = i)。
- 读取测试用例的数量
- 计算交换次数:
- 初始化交换次数
res为0。 - 遍历数组
a,对于每个元素a[i],如果a[i]不等于i,则进行交换操作:- 初始化
cnt为0,posi为i,targetposi为a[i],p为b[i]。 - 进入循环,交换
a[posi]和a[p],更新posi为p,p为b[p],cnt加1,直到posi等于targetposi。 - 将
cnt加到res中。
- 初始化
- 初始化交换次数
- 输出结果:
- 输出每个测试用例的最少交换次数
res。
- 输出每个测试用例的最少交换次数
#include<iostream> using namespace std; int n,a[10001], b[10001]; int main(){ int nc; cin >> nc; while(nc--){ cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i]; b[a[i]] = i; } int res = 0; for(int i = 1; i <= n; i++) if(a[i]!=i){ int cnt = 0, posi = i, targetposi = a[i], p = b[i]; while(posi!=targetposi){ swap(a[posi],a[p]); posi = p; p = b[p]; cnt++; } res += cnt; } cout << res << endl; } } - 输入处理:
- 1
信息
- ID
- 675
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者