第十三届蓝桥杯C++B组省赛 I 题——李白打酒加强版 (AC)
admin
2024-01-20 22:04:33
0

目录

  • 1.李白打酒加强版
    • 1.题目描述
    • 2.输入格式
    • 3.输出格式
    • 4.样例说明
    • 5.数据规模
    • 6.原题链接
  • 2.解题思路
  • 3.Ac_code

1.李白打酒加强版

1.题目描述

话说大诗人李白, 一生好饮。幸好他从不开车。

一天, 他提着酒壶, 从家里出来, 酒壶中有酒 2 斗。他边走边唱:

无事街上走,提壶去打酒。 逢店加一倍, 遇花喝一斗。

这一路上, 他一共遇到店 NNN 次, 遇到花 MMM 次。已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白这一路遇到店和花的顺序, 有多少种不同的可能?

注意: 壶里没酒 ( 0 斗) 时遇店是合法的, 加倍后还是没酒; 但是没酒时遇 花是不合法的。

2.输入格式

5 10

3.输出格式

14

4.样例说明

如果我们用 0 代表遇到花,1 代表遇到店,14 种顺序如下:

010101101000000

010110010010000

011000110010000

100010110010000

011001000110000

100011000110000

100100010110000

010110100000100

011001001000100

100011001000100

100100011000100

011010000010100

100100100010100

101000001010100

5.数据规模

1≤N,M≤1001≤N,M≤1001≤N,M≤100

6.原题链接

李白打酒加强版

2.解题思路

比较明显是一道状态机dp的题目,如何定义好状态可以帮助我们更好地初始化和转移以及求解答案,根据题目范围最大为100,比较明显暗示我们做法是一个O(n3)O(n^3)O(n3)的dpdp状态也应该是三维的。定义状态f[i][j][k]f[i][j][k]f[i][j][k] 为已经遇到 iii 次店,jjj次花,还剩 kkk 斗酒的方案数。状态初始化明显是f[0][0][2]=1

对于酒的上限数量,我们应该想好范围,因为花最多只有 mmm 朵,意味着我们最多只能喝 mmm 壶酒,对于 kkk 超过 mmm 的状态都是无效状态我们无需关心。所以剩余酒的上限也就是 kkk 应该也定为 mmm 。

考虑进行状态转移,对于状态f[i][j][k]f[i][j][k]f[i][j][k],假设最后一次遇到的是店,那么此时需要保证 iii 大于0,并且 kkk 是偶数,因为遇到店剩余酒翻倍,kkk 一定不可能为奇数,那么可以得到转移方程
f[i][j][k]=(f[i][j][k]+f[i−1][j][k/2])%modf[i][j][k] = (f[i][j][k] + f[i - 1][j][k / 2]) \% modf[i][j][k]=(f[i][j][k]+f[i−1][j][k/2])%mod

假设最后一次遇到的是花,那么此时只需要保证 jjj 大于 0即可,我们可以获得转移方程f[i][j][k]=(f[i][j][k]+f[i][j−1][k+1])%modf[i][j][k] = (f[i][j][k] + f[i][j - 1][k + 1]) \% modf[i][j][k]=(f[i][j][k]+f[i][j−1][k+1])%mod

我们还得考虑答案输出什么,题目要求最后一次遇到的必须是花,那么我们直接输出 f[n][m][0]f[n][m][0]f[n][m][0] 肯定是错误的答案。 因为这并不能保证最后一次遇到的是花,因为最后是0壶酒,那么在遇到最后一朵花时应该还剩1壶酒,所以我们可以输出 f[n][m−1][1]f[n][m-1][1]f[n][m−1][1] 作为答案。

3.Ac_code

#include
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 110;int n, m;
//已经遇到i次店,j次花,还剩k斗酒的方案数
LL f[N][N][N];
void solve()
{cin >> n >> m;f[0][0][2] = 1;for (int i = 0; i <= n; ++i) {for (int j = 0; j <= m; ++j) {for (int k = 0; k <= m; ++k) {//最后一次遇到店if (i && k % 2 == 0) f[i][j][k] = (f[i][j][k] + f[i - 1][j][k / 2]) % mod;//最后一次遇到花if (j) f[i][j][k] = (f[i][j][k] + f[i][j - 1][k + 1]) % mod;}}}cout << f[n][m - 1][1] << '\n';
}
int main()
{ios_base :: sync_with_stdio(false);cin.tie(nullptr);int t = 1;while (t--){solve();}return 0;
}

相关内容

热门资讯

安卓系统缓存很难清理吗,安卓系... 手机用久了,是不是发现安卓系统的缓存就像顽固的石头,怎么也清理不干净?别急,今天就来跟你聊聊这个让人...
安卓系统通话闪退,安卓通话闪退... 手机里的安卓系统通话突然闪退,是不是让你心头一紧,感觉像是遇到了什么神秘力量?别急,今天就来跟你聊聊...
原车转安卓系统,体验智能新篇章 你有没有想过,你的爱车原车系统居然可以变身成安卓系统?没错,就是那个我们日常使用的安卓系统!今天,就...
安卓建议更新系统嘛,系统更新建... 亲爱的安卓用户们,你是不是也经常收到系统更新的提示,心里直打鼓:“这更新到底该不该点呢?”今天,就让...
小米5系统是安卓几,揭秘其背后... 你有没有想过,你的小米5手机里那神秘的系统,它到底属于安卓的哪个大家庭呢?今天,就让我带你一探究竟,...
安卓删除旧版系统缓存,释放存储... 手机用久了是不是感觉越来越卡?别急,今天就来教你怎么给安卓手机清理旧版系统缓存,让你的手机焕然一新,...
安卓windows双系统平板推... 你有没有想过,拥有一台既能流畅运行安卓应用,又能轻松驾驭Windows办公软件的平板电脑,那该是多么...
安卓系统的烹饪游戏在哪,解锁美... 你有没有想过,在忙碌的生活中,来点轻松的烹饪游戏,既能放松心情,又能学到一些烹饪技巧呢?安卓系统上的...
苹果系统转安卓系统需要钱吗,费... 你有没有想过,从苹果系统跳转到安卓系统,这中间的花费到底是个啥情况呢?是不是得准备一大笔钱,才能完成...
安卓系统平板手势密码,安全便捷... 你有没有发现,现在的生活越来越离不开手机和平板电脑了?这些小家伙不仅方便了我们的生活,还让我们的世界...
安卓系统升级后HD,安卓系统升... 你有没有发现,自从你的安卓手机升级了系统,那个HD画质好像变得不一样了呢?是不是觉得屏幕上的画面更加...
安卓十系统手机如何root,安... 亲爱的手机控们,你是否对安卓十系统手机充满了好奇,想要探索它的无限可能?今天,就让我带你一起揭开安卓...
tcl触屏切换安卓系统,体验安... 你有没有想过,家里的老式电视突然变成了智能大屏,那感觉是不是就像穿越到了未来?没错,这就是现在科技的...
国产安卓最简洁的系统,极致体验 你有没有发现,现在的手机系统越来越复杂了?各种功能堆砌得让人眼花缭乱,有时候甚至觉得手机比电脑还难操...
更换系统推荐免费安卓,免费安卓... 手机用久了是不是感觉有点卡?别急,今天就来给你支个招——更换系统推荐免费安卓!是的,你没听错,就是免...
安卓系统锁屏图片更换,安卓系统... 你有没有发现,手机锁屏界面简直就是个人风格的展示台呢?今天,就让我带你一起探索如何给安卓系统的锁屏图...
hms和安卓系统的关系,构建全... 你知道吗?在科技的世界里,有时候两个看似毫不相干的东西,竟然能擦出不一样的火花。今天,咱们就来聊聊这...
求安卓系统斗地主脚本,智能策略... 你有没有想过,在斗地主这款游戏中,能不能有个小帮手,帮你轻松赢取胜利呢?没错,今天就要来聊聊这个热门...
安卓系统运行内存扩充,解锁高效... 你有没有发现,随着手机应用的日益丰富,安卓系统的运行内存(RAM)有时候就像一个装满宝贝的箱子,总是...
如何自动发消息安卓系统,安卓系... 你是不是也和我一样,手机里堆满了各种群聊和好友,每天都要手动回复消息,累得够呛?别急,今天就来教你怎...