A、青蛙过河
是不是乍一眼看起来像哈诺塔……恭喜你被骗了。汉诺塔可以随意移动,虽然也有一定前提。但是对这个题目来说最要命的约束条件就是到了对面就不能动了。
所以就决定了,一定是重的青蛙先跳去对面。所以我们从几个极端来看。
如果给出莲叶数是n,石头数目是m。
如果m是0,那么最多可以允许 n + 1 个青蛙,n个青蛙填满莲叶,最后一个青蛙跳过去。
如果m是1,那么最多允许 n + 1 个青蛙先填满莲叶,在去石头上面过渡,另外的 n + 1 个青蛙根据 m = 0 的情况跳。所以一共 (n + 1) * 2
……所以得到 n m 和答案的关系
每多一个垫脚石 答案乘个2。
#include <bits/stdc++.h> #pragma GCC optimize(2) #pragma GCC optimize(3) using namespace std; #define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0) typedef long long ll; inline ll read() { ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } int main() { int n = read(), m = read(); int ans = (m + 1) * (1 << n); printf("%d\n", ans); return 0; }