问题 D: 皇家棋神(upc补题)

时间限制: 1 Sec 内存限制: 128 MB
题目描述
看到下图,拥有QQ宠物的同学对下图一定不会陌生,没错这就是QQ宠物皇家战棋。自从2009元旦前夕腾讯推出该款游戏,迅速成为热门游戏,不仅仅因为其可爱的造型,更有元宝和蓝钻的诱惑。
小明为了给自己的宠物赚取足够的生活费,也加入了激烈的角逐。由于战术运用得当,加上些许的运气,小明屡战屡胜。转眼间,时间过去了2个月,小明也成为了名副其实的万元户+大城主,宠物也衣食无忧。
而此时的玩家,都已具备了一定的战术经验,小明也占不到丝毫便宜,大多数时候只能靠运气取胜,此时皇家战棋也变得索然无味。于是小明开始思考另外一个有趣的问题,若是每个战棋能自我成长,又能训练新兵,那一定很有意思。
有一天,在一个毫无防备力量的城邦,诞生了一名划时代的领袖(当然他也是从士兵做起),每过一个时刻,任何一个作战单位的战斗力就会提升一分,而每个作战单位在提升力量的同时,又会培养一名新兵作为下属,每个作战单位所能拥有的下属数量上限为k。小明很想知道,在给定下属上限数量k的情况下,第n个时刻该城邦所具有的总战斗力。
在k=2,n=5时情况如下:
在这里插入图片描述在这里插入图片描述
在第5个时刻,城邦的领袖,已经蜕变为将军,而整个军队的战斗力也从第1个时刻的1,变为26。而随着军队战斗力与部队数量的增加,城邦已经有足够的力量抵御外敌,城邦的战斗力在到达或者超过1234567890之后,每个战斗单位的战斗力将不再增加,也不再训练新兵。
小明想要知道,在第n时刻,每个单位最大下属数量为k时,城邦的战斗力。

输入
第一行包含2个正整数n和k,1<=n,k<=2^32-1。
输出
共1行,第n时刻城邦所具有的总战斗力。
样例输入 Copy
5 2
样例输出 Copy
26
列出几项就可以得到递推式 a[n]=a[n-1]+a[n-2]+……+a[n-k];
但是自己太粗(sha)心(zi)了,就是在n-k<0 的情况下,硬生生的写成了return 0;老是觉得思路没错,就一直去找语法上的问题。(不知道吃了多少次这样的亏了)吃一堑,长一智吧。
话不多说了

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <map>
#define ll long long
#define inf 0x3f3f3f3f
const int maxn=1e5+10;
using namespace std;
map<ll,ll> a;
ll sigma(ll l,ll b);
int main()
{
    ll n,k,i,ans=1;
    scanf("%lld%lld",&n,&k);
    a[0]=0;
    a[1]=1;
    for(i=2; i<=n; i++)
    {
        a[i]=sigma(i-k,i-1)+i;
        if(a[i]>=1234567890)
        {
            ans=a[i];
            break;
        }
        ans=a[i];
    }
    printf("%lld",ans);
    return 0;
}
ll sigma(ll l,ll b)
{
    ll an=0;
    if(l<0)
        l=0;

    for(ll i=l; i<=b; i++)
        an+=a[i];
    return an;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值