题目大意
多组数据。
每组数据给定 k k k, n n n 和一个 1 1 1 到 n n n 的排列 p p p,每次操作可以交换 p i p_i pi 和 p j p_j pj ( i ≠ j ) (i\ne j) (i=j),求最少的操作数,使 ∑ i = 1 k p i \sum\limits_{i=1}^kp_i i=1∑kpi 最小。
1 ≤ k ≤ n ≤ 100 1\le k\le n\le100 1≤k≤n≤100, 1 ≤ p i ≤ n 1\le p_i\le n 1≤pi≤n。
题解
这道题实际上就是求通过交换任意两个元素,把 [ p 1 ⋯ p k ] [p_1\cdots p_k] [p1⋯pk] 转换为 1 1 1 到 k k k 的排列的最小交换数。
答案便是 [ p 1 ⋯ p k ] [p_1\cdots p_k] [p1⋯pk] 中满足 p i > k p_i>k pi>k 的 p i p_i pi 的数量。
代码
#include<bits/stdc++.h>
using namespace std;
int t,n,k,a[10001],ans;
int main()
{
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i<=k&&a[i]>k)
ans++;
}
cout<<ans<<'\n';
}
return 0;
}