题解:P11908 [NHSPC 2023] G. 博物館(@Arthur2024)
Arthur2024 · · 题解
题目意思
题目传送门
题目让我们在
思路
假如我们先将价值最昂贵的
我们可以想到一个作品在往前搬时,有可能会把另一个也要往前搬的作品交换,此时另一个作品的位置会随着前面的哪个作品的交换往后退,这导致后面再搬这个作品时,会比原来多搬一次。
为了避免这种情况,我们会优先搬最靠前的要搬的作品,这样在搬的过程就不会影响后面的作品,并且第一个搬的作品最后会到第一个位置,第二个搬的作品最后会到第二个位置,以此类推。
注意不能找出最昂贵的
我这里用一个数表示两个数,即将第一个数乘一个比第二个数可能的范围还要大的数再加上第二个数,这样做是为了后面排序做准备,这样就能做到第一个数小的在前,大的在后,相同的第二个数小的在前,大的在后,记得开 longlong。
我这里把
提取的时候注意要先取模,再用
最后记得开 longlong。
AC代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int c[100010];
signed main(){
int n,k,ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>c[i];
}
for(int i=1;i<=n;i++){
c[i]=c[i]*1000000+n-i;//用c数组存储的一个数存储两个数,方便排序
}
sort(c+1,c+n+1);//排序
for(int i=n;i>n-k;i--){
ans+=n-c[i]%1000000-k+n-i;//提取每个作品需搬的次数
}
cout<<ans;
return 0;
}
谢谢观看!