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;
}
标签:node,正整数,CF1712A,题解,return,int,Wonderful,操作,排序 来源: https://www.cnblogs.com/Dregen-Yor/p/16588725.html