C - Strange Birthday Party(贪心)

题意
我有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
 */
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值