皇家棋神
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了皇家棋神相关的知识,希望对你有一定的参考价值。
【题目描述】
有 qq 宠物的同学想必都不会陌生,qq 宠物里有一个游戏,叫做皇家战棋。 ZQH是个骨灰级的玩家,他已经赢了很多盘,等级也升的很高。但是慢慢的,大家的水平都挺 高了,都已具备了一定的战术经验,ZQH也占不到丝毫便宜,大多数时候只能靠运气取胜,此 时皇家战棋也变得索然无味。于是ZQH开始思考另外一个有趣的问题,若是每个战棋能自我成 长,又能训练新兵,那一定很有意思。 将来的某一天,在一个神奇的城市,诞生了一名划时代的领袖(当然他也是从士兵做起), 每过一个时刻,任何一个作战单位的战斗力就会提升一分,而每个作战单位在提升力量的同 时,又会培养一名新兵作为下属,每个作战单位所能拥有的下属数量上限为 k。 ZQH很想知道, 在给定下属上限数量 k 的情况下,第 n 个时刻该城邦所具有的总战斗力。 在 k=2,n=5 时情况如下:
在第 5 个时刻,城邦的领袖,已经蜕变为将军,而整个军队的战斗力也从第 1 个时刻 的1,变为26。而随着军队战斗力与部队数量的增加,城邦已经有足够的力量抵御外敌,城邦 的战斗力在到达或者超过 1234567890 之后,每个战斗单位的战斗力将不再增加,也不再训 练新兵。 ZQH想要知道,在第 n 时刻,每个单位最大下属数量为 k 时,城邦的战斗力。
【输入格式】
输入文件名为chess.in。 第一行包含2个正整数n和k,1<=n,k<=2^32-1。
【输出格式】
输出文件chess.out 共1行,第n时刻城邦所具有的总战斗力。
【分析】
每次枚举一下,得到一个递推方程,f[i]=sum(f[i],f[i-1]..f[i-k]),直接算就可以了,开long long。
【代码】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 ll n,k; 8 int f[100010]; 9 10 int main() 11 { 12 memset(f,0,sizeof(f)); 13 scanf("%lld%lld",&n,&k); 14 f[1]=1; f[2]=3; 15 ll i=3,j; 16 while(i<=n){ 17 j=1; 18 while(j<=k){ 19 f[i]+=f[i-j]; 20 j++; 21 } 22 f[i]+=i; 23 if(f[i]>=1234567890){printf("%d ",f[i]);return 0;} 24 i++; 25 } 26 printf("%d ",f[n]); 27 return 0; 28 }
以上是关于皇家棋神的主要内容,如果未能解决你的问题,请参考以下文章