题意
我有n个朋友,商店有m种商品,这m种商品按序号价格从小到大排列,对于每一个朋友我给出一个序号k,我可以直接给朋友序号k的商品价格的金钱或给朋友买一个序号小于k的商品,且每种商品最多只能买一次,问我需要花费的最少金钱?
思路
我们知道,
k
i
k_i
ki越大的人,如果选择钱的话,花费的钱是越多的,我们要让
k
i
k_i
ki越大的人选的礼物越小,
k
i
k_i
ki小的人虽然选的礼物少,但是可以选择钱,这样做花费是最小的,我们对
k
i
k_i
ki从大到小排序,然后从小到大的选择礼物,如果没有能选的礼物,就选自己对应的钱。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
ll k[N],c[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=1 ; i<=n ; i++) cin>>k[i];
for(int i=1 ; i<=m ; i++) cin>>c[i];
sort(k+1,k+1+n);
ll ans=0;
int idx=1;
for(int i=n ; i>=1 ; i--)
{
if(idx<k[i])
{
ans+=c[idx];
idx++;
}
else ans+=c[k[i]];
// cout<<ans<<endl;
}
cout<<ans<<endl;
}
return 0;
}
/*
1 10
5
2 3 9 30 566 1337 31337 70775 111111 413413
*/