首页 > 其他分享 >传球游戏【NOIP2018普及组T3】(ybtoj 递推例题2)

传球游戏【NOIP2018普及组T3】(ybtoj 递推例题2)

时间:2022-08-20 11:26:19浏览次数:80  
标签:同学 传球 ch ybtoj T3 long include 例题 define

题目描述

上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。

游戏规则是这样的: 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。

聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传  次以后,又回到小蛮手里。两种传球方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有三个同学  号、 号、 号,并假设小蛮为  号,球传了  次回到小蛮手里的方式有  和 ,共  种。

输入格式

一行,有两个用空格隔开的整数 。

输出格式

 个整数,表示符合题意的方法数。

样例输入

3 3

样例输出

2

第一次写的时候,考虑f[i][j]为i个人传j次的合法方案数,当球来到第i个人手中时,球可能由周边(i - 1)个人传来,则推得f[i][j] = f[i - 1][j - 1] * (i - 1);
然后就写挂了。。。。。。

回来重新看题 发现是题没读懂。。
这是一个环 第i个人只能由左边或右边的人所指向 所以i的上一层应该是i - 1或i + 1,且环头环尾相接
所以 正确的递推式为 :
f[i][j] = f[i + 1][j - 1] + f[i - 1][j - 1];
注意!!:
当遇到环头或环尾时 需要特判:
当传到第一个人时 第一个人会由第二个人或第n个人传来
当传到第n个人时 第n个人会由第n - 1个人或第一个人传来
特判完成 上代码!!!
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <climits>
 5 #include <cassert>
 6 #include <cmath>
 7 #include <cstring>
 8 #include <cstdlib>
 9 #include <cctype>
10 #include <utility>
11 #include <set>
12 #include <map>
13 #include <stack>
14 #include <queue>
15 #include <vector>
16 #define int long long
17 #define ll long long
18 #define ull unsigned long long
19 #define re register
20 #define lowbit(x) x & (-x)
21 #define gcd(a,b) _gcd(a,b)
22 #define mid ((l + r) >> 1)
23 #define rep(i,a,b)  for(re int i(a);i <= b;i ++)
24 #define rrep(i,a,b) for(re int i(a);i >= b;i --)
25 using namespace std;
26 inline int read(){
27     re int x = 0,f = 1;
28     re char ch = getchar();
29     while(ch < '0' || ch > '9'){
30         if(ch == '-') f = -1;
31         ch = getchar();
32     }
33     while(ch >= '0' && ch <= '9'){
34         x = (x << 3) + (x << 1) + (ch ^ 48);
35         ch = getchar();
36     }
37     return x * f;
38 }
39 int f[301][301];
40 signed main(){
41     int n = read();
42     int k = read();
43     f[1][0] = 1;
44     rep(i,1,k){
45         rep(j,1,n){
46             if(j == 1) f[j][i] = f[2][i - 1] + f[n][i - 1];
47             else
48             if(j == n) f[j][i] = f[1][i - 1] + f[n - 1][i - 1];
49             else f[j][i] = f[j - 1][i - 1] + f[j + 1][i - 1];
50         }
51     }
52     cout << f[1][k] << endl;
53     return 0;
54 }

国赛神犇加油!!

24OIfighting!!!

 

标签:同学,传球,ch,ybtoj,T3,long,include,例题,define
From: https://www.cnblogs.com/Eruption/p/16607351.html

相关文章

  • 树形dp例题 + 学习笔记(入门版)
    树形dp,即在树上进行dp。需要对树这一数据结构有清晰的了解。其中重点在于树的遍历、子树相关问题。难点常常在于状态方程的书写。例题一、没有上司的舞会题意树上每......
  • YbtOJ 做题记录-总集版
    感觉每章都开一篇博客过于占据版面(以及写不动题了想摸一会鱼于是就有了您现在看到的这篇博客。基础算法第1章递推算法第2章贪心算法第3章二分算法图论第2章......
  • IFC中的位置及方向(IfcAxis2Placement3D)
    IfcAxis2Placement3D定义了三维空间中物体的位置和方向,由三部分组成:Location:位置Axis:Z轴方向RefDirection:X轴方向注:Y轴方向由X轴和Z轴方向通过外积计算获得......
  • YbtOJ 「图论」第2章 最小生成树
    为什么区间dp又咕咕咕了QAQ于是随机抽取了一个幸运章节来做。目前处于半摆烂状态。例题1.繁忙都市板子。写了下以前几乎没写过的堆优化Prim。code#include<bits/......
  • 复合函数例题合集
    第一题\[y=tan\frac{2x}{1+x^{2}},\quady'=?\]\[\\\\\]\[y=tanu,u=\frac{2x}{1+x^{2}},\quady'=(tanu)'(u)'\]\[\\\\\]\[(tanu)'=sec^{2}\frac{2x}{1+x^{2}}\]\[......
  • YbtOJ 「数据结构」第4章 线段树
    不想dp了怎么办?开个新坑吧。例题1.求区间和树状数组不香吗,28行解决(bushi所以懒得打线段树了。code#include<bits/stdc++.h>#defineintlonglongusingnamespac......
  • YbtOJ 「基础算法」第3章 二分算法
    例题1.数列分段二分每段和的最大值。check时从左往右扫,如果当前段的和大于限制则新开一段。code#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;i......
  • 导数例行例题
    \[设f(x)=x^{3}+2cosx+ln3,\quad求f(x)'和f(\frac{π}{2})'\]\[\\\\\]\[f(x)'=(x^{3})'+(2cosx)'+(ln3)'\]\[\\\\\]\[(x^{3})......