脑力激活 F: Occult的卡片升级计划 dp

问题 F: Occult的卡片升级计划

时间限制: 1 Sec   内存限制: 128 MB
提交: 61   解决: 12
[ 提交][ 状态][ 讨论版]

题目描述

Occult喜欢玩一款手游,手游中有很多好看的卡片。他想要升级这些卡。
现在他有m块经验石,目标是强化一张卡片,卡片最开始的时候是0级,卡片会升级,而升级所需的经验会越来越多。
假设卡片满级是n级,给出a[1],a[2]....a[n],a[i]表示从i-1级升到i级所需的经验石数量。保证a[1]+a[2]+...+a[n]=m,且a[1]<=a[2]<=..<=a[n]。
然而每次强化是要付钱的,并且每次加的经验石的数量是有限的,最多为10个。
每一次强化要付的金钱等于这一次加的经验石的数量乘上当前卡片的等级。
Occult想知道要把这张卡片从0级升到满级最少需要支付多少金钱。

例如输入:
2 15
5 10
表示卡片满级是2级,现在有15块经验石。第0级升到第1级所需的经验石数量是5个,第1级升到第2级所需的经验石数量是10个。

我们可以采取以下升级策略,使得支付的金钱最少:
[
第一次强化]
4个经验石。这次强化的费用:0级×4个石头=0元。强化之后升到了0级。
[
第二次强化]
10个经验石。这次强化的费用:0级×10个石头=0元。强化之后升到了1级。
[
第三次强化]
1个经验石。这次强化的费用:1级×1个石头=1元。强化之后升到了2级。

强化完毕,把三次的花费加起来,是1元。

输入

多组测试数据。
每组测试数据第一行输入n,m。(0<n<=m<=100000)
第二行输入n个整数a[1],a[2]......,a[n]。
保证a[1]+a[2]+...+a[n]=m,且a[1]<=a[2]<=..<=a[n]。

输出

对于每组测试数据,输出卡片从0级升到满级需要支付的最少金钱。

样例输入

2 15
5 10

样例输出

1



//简单dp
//存储每一个经验石使用时所处的等级
//得到每一个经验石使用时的最小花费
//每次最多用10块经验石
//核心 tot=min(tot,k[i-j]+c[i-j]*j);
#include <bits/stdc++.h>
using namespace std;
const int maxx=100005;
int n,m;
int a[maxx];
int c[maxx];            //经验石使用时所处的等级
long long int k[maxx];  //每一个经验石使用时的最小花费
void printc(int x)
{
    for(int i=1;i<=m;i++)
    {
        cout<<c[i]<<" ";
    }
    cout<<endl;
}
void printk(int x)
{
    for(int i=1;i<=m;i++)
    {
        cout<<k[i]<<" ";
    }
    cout<<endl;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        long long int sum=a[1];
        int t1=2;
        int t=0;
        for(int i=0; i<=m; i++)
        {
            if(i>=sum)
            {
                t++;
                sum=sum+a[t1++];
            }
            c[i]=t;
        }
       // printc(1);
        for(int i=1; i<=m; i++)
        {
            long long int tot=c[i-1]+k[i-1];
            for(int j=1; j<=10; j++)
            {
                if(j>i) break;
                tot=min(tot,k[i-j]+c[i-j]*j);
            }
            k[i]=tot;
        }
       // printk(1);
        printf("%lld\n",k[m]);
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值