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
- 上传者