标签:node 正整数 CF1712A 题解 return int Wonderful 操作 排序
题目大意
-
给定一个长度为 \(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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。