第十三届蓝桥杯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;
}

相关内容

热门资讯

windowsce改安卓系统吗... 你有没有想过,把那台老掉牙的Windows CE设备改头换面,让它摇身一变成为安卓小精灵呢?这可不是...
安卓系统的p图软件 你有没有发现,手机里的照片总是不够完美?有时候,一张照片的某个角落有点瑕疵,或者表情不够自然,这时候...
13道奇酷威安卓系统,功能解析... 你有没有想过,一辆车,不仅仅是交通工具那么简单?它还能成为你生活中的智能伙伴。今天,就让我带你走进1...
安卓系统开不了网站了,排查与解... 最近我的安卓手机有点儿闹脾气,打开网页的时候总是卡壳,有时候甚至直接开不了网站了。这可真是让人头疼啊...
安卓系统怎么不关闭wifi,实... 你有没有遇到过这种情况:手机里的安卓系统明明开着WiFi,但你就是找不到关闭它的方法?别急,今天就来...
安卓系统比苹果延迟吗,延迟性能... 你有没有想过,为什么你的安卓手机有时候会慢吞吞的,而朋友手里的苹果手机却像风一样快呢?今天,我们就来...
安卓高端操作系统排名,揭秘年度... 你有没有想过,手机里的安卓操作系统,其实就像一个个小宇宙,各有各的精彩?今天,就让我带你一起探索一下...
取消安卓系统消息提醒,深度解析... 你是不是也和我一样,手机里充斥着各种消息提醒,有时候甚至让人感到烦躁呢?今天,就让我来和你聊聊如何取...
外卖管理系统安卓源码,架构解析... 你有没有想过,点外卖的时候,那些外卖小哥是如何快速找到你的呢?其实,这一切都离不开一个神奇的小工具—...
安卓怎么线刷ios系统,轻松实... 你有没有想过,把安卓手机刷成iOS系统,是不是就像给手机换了个新灵魂呢?想象那流畅的操作体验,那独特...
大熊苏州麻将安卓系统,体验传统... 你有没有听说过这款超级好玩的大熊苏州麻将安卓系统?最近,这款游戏在朋友圈里可是火得一塌糊涂,让不少麻...
安卓类原生系统费电,费电背后的... 你有没有发现,手机用着用着,电量就“嗖”的一下子就没了?尤其是那些运行安卓类原生系统的手机,简直是电...
安卓开发保存视频到系统,视频保... 你有没有想过,在安卓手机上开发一个应用,保存视频到系统文件夹,这可是个技术活儿!想象用户拍了一段美美...
华为装安卓12系统,引领智能体... 你知道吗?最近华为的新动作可是让整个科技圈都沸腾了!他们竟然要给自家的手机装上安卓12系统!这可不是...
苹果系统怎么送安卓东西,跨平台... 你是不是也有过这样的烦恼?手机里存了好多好用的安卓应用,但是新买的iPhone却怎么也找不到合适的方...
基于安卓的pc系统,融合移动与... 你有没有想过,你的安卓手机和电脑之间竟然可以无缝连接?没错,就是那种你可以在电脑上直接操作手机应用的...
老安卓系统能干啥,重温经典功能... 你手中的老安卓手机是不是已经陪伴你走过了好几个春夏秋冬呢?别看它外表略显沧桑,但它的内心可是充满活力...
安卓系统怎么更改设置 手机里的安卓系统是不是有时候让你觉得有点儿不爽?比如,那些默认的设置总感觉不够个性,或者是某些功能用...
安卓系统hd什么意思,高性能与... 你有没有注意到,你的安卓手机屏幕上时不时会出现“HD”这个词?是不是好奇这到底是什么意思呢?别急,今...
王者荣耀ios系统怎么变安卓系... 你是不是也和我一样,对王者荣耀iOS系统到安卓系统的转换充满了好奇?想象那些熟悉的英雄角色,那些刺激...