1 条题解

  • 0
    @ 2025-5-8 15:05:46

    解题思路

    1. 输入处理
      • 读取测试用例的数量 nc
      • 对于每个测试用例,读取数组的长度 n
      • 读取数组 a 的元素,同时在数组 b 中记录每个元素 a[i] 在原数组中的下标 i(即 b[a[i]] = i)。
    2. 计算交换次数
      • 初始化交换次数 res0
      • 遍历数组 a,对于每个元素 a[i],如果 a[i] 不等于 i,则进行交换操作:
        • 初始化 cnt0posiitargetposia[i]pb[i]
        • 进入循环,交换 a[posi]a[p],更新 posippb[p]cnt1,直到 posi 等于 targetposi
        • cnt 加到 res 中。
    3. 输出结果
      • 输出每个测试用例的最少交换次数 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
    上传者