CF + 思维题:Strange Birthday Party

题目链接:Problem - C - Codeforces

题目:

我有n个朋友,商店有m种商品,这m种商品按序号价格从小到大排列,对于每一个朋友我给出一个序号k,我可以直接给朋友序号k的商品价格的金钱或给朋友买一个序号小于等于k的商品,且每种商品最多只能买一次,问我需要花费的最少金钱?

分析:

此题有一个很重要的信息,就是c[i] < c[i + 1] < c[i + 2] ,所有的c[]值输入时就是升序排列的。

所以我们可以将k[]进行从小到大的排序。 

并且从后往前进行取值,

因为k[i]小的可以取k[i]对应的值,而k[i]小,对应的c[k[i]]值就小。

而k[i]大的。如果1~k[i]都取过了,那么就只能取k[i].

所以我们从后往前,k[i]大的则取小值。如果被取了就取k[i],k[i]小的如果到时候被取了则就取k[i]即可。

代码实现:

# include <iostream>
# include <algorithm>
using namespace std;

const int N = 3e5 + 10;

int k[N];
int c[N];

int t,n,m;

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        long long ans = 0;
        int cnt = 1; // 当前可以取第cnt个了
        scanf("%d %d",&n,&m);
        for(int i = 1 ; i <= n ; i++)
        {
            scanf("%d",&k[i]);
        }
        for(int i  = 1 ; i <= m ; i++)
        {
            scanf("%d",&c[i]);
        }

        sort(k + 1 , k + 1 + n);

        for(int i = n ; i >= 1 ; i--)
        {
            if(cnt <= k[i])
            {
                ans += c[cnt++];
            }
            else
            {
                ans += c[ k[i] ];
            }
        }

        printf("%lld\n",ans);

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<--- Last few GCs ---> [11584:0000020B71203B50] 69329 ms: Scavenge (reduce) 2037.9 (2050.3) -> 2037.3 (2051.3) MB, 6.3 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure [11584:0000020B71203B50] 69339 ms: Scavenge (reduce) 2038.2 (2053.3) -> 2037.6 (2053.3) MB, 3.2 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure [11584:0000020B71203B50] 69348 ms: Scavenge (reduce) 2038.3 (2050.5) -> 2038.1 (2052.0) MB, 3.3 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure 12: 00007FF6482BAB44 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithFiller+84 13: 00007FF6482BAE43 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithMap+35 14: 00007FF6480C8A10 v8::internal::HashTable<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::EnsureCapacity<v8::internal::Isolate>+208 15: 00007FF6480C6086 v8::internal::Dictionary<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::Add<v8::internal::Isolate>+102 16: 00007FF6480CF346 v8::internal::BaseNameDictionary<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::Add+118 17: 00007FF647FC430C v8::internal::Runtime::GetObjectProperty+2204 18: 00007FF64848B50D v8::internal::SetupIsolateDelegate::SetupHeap+463949 19: 00007FF6485017A9 v8::internal::SetupIsolateDelegate::SetupHeap+947945 20: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 21: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 22: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 23: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 24: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 25: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 26: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 27: 0000028E519B08BF
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值