CF1712A Wonderful Permutation 题解

题目大意

  • 给定一个长度为 \(n\) 的正整数序列 $ p_1,p_2,\ldots,p_n $ 和一个正整数 \(k\)

  • 可以进行若干次操作,每次操作选定两个正整数 \(i\)\(j\),交换 \(p_i\)\(p_j\)

  • 求进行若干次操作后,求使 \(\sum\limits_{i=1}^kp_i\) 的值最小需要进行的操作次数。

思路

要使使 \(\sum\limits_{i=1}^kp_i\) 的值最小,只需把相对较小的值排在前 \(k\) 个即可,直接用 sort 函数进行排序,排序的同时还要记录一下排序前的位置,遍历排序后前 \(k\) 个位置的数,比较他原先的位置是否在前 \(k\) 位,若不在,则说明这个数需要进行一次操作交换到前 \(k\) 位,若该数原先就在前 \(k\) 位,则不需要进行操作。

最终统计排序后的前 \(k\) 个数中原先不在前 \(k\) 位的数的个数即可。

代码

#include <bits/stdc++.h>
using namespace std;
int t,n,k;
struct node{
	int w,s;
}a[110];
bool cmp(node x,node y){
	return x.w<y.w;
}
int main() {
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&k);
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i].w);
			a[i].s=i;
		}
		sort(a+1,a+1+n,cmp);
		int ans=0;
		for(int i=1;i<=k;i++){
			if(a[i].s>k){
				ans++;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
} 
posted @ 2022-08-15 16:25  Dregen_Yor  阅读(53)  评论(0)    收藏  举报