题目:传球游戏【NOIP2008普及组】


题目描述

  上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子的,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。
  聪明的小蛮提出了一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。

输入输出格式

输入格式:

  输入文件ball.in共一行,有两个用空格隔开的整数n,m(3 <= n <= 30,1 <= m <= 30)。

输出格式:

  输出文件ball.out共一行,有一个整数,表示符合题意的方法数。

输入输出样例

输入样例#1:

3 3

输出样例#1:

2

提示信息

【限制】
  40%的数据满足:3 <= n <= 30,1 <= m <= 20
  100%的数据满足:3 <= n <= 30,1 <= m <= 30

题目分析:

首先,根据题意,它球可以往右或往左传,以+1与-1表示,刚开始,球在0号手上,0可以选择-1与+1,当累计的值%n为0时,则方案加1.

即从当前状态可扩散出两个状态:x-1与x+1.

因此,dfs代码很容易写出:

#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,d[310][310];
void dfs(long long val,long long k)
{if(val%n==0&&k==m){ans++;return;}if(k==m) return;dfs(val-1,k+1);dfs(val+1,k+1);
}
int main()
{cin>>n>>m;dfs(0,0);cout<<ans;return 0;
} 

时间复杂度:O(2^m):极限数据下2^30大于1e9......

正解:动态规划。

根据dfs,我们可以换算成状态转移方程:

即d[i+1][((j-1)+n)%n]=d[i][j]+d[i+1][((j-1)+n)%n];

d[i+1][(j+1)%n]=d[i][j]+d[i+1][(j+1)%n];

其中d[i][j]表示传i次球,落在j+1小朋友身上的方案总数。

#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,d[310][310];
void dfs(long long val,long long k)
{if(val%n==0&&k==m){ans++;return;}if(k==m) return;dfs(val-1,k+1);dfs(val+1,k+1);
}
int main()
{cin>>n>>m;d[0][0]=1;for(long long i=0;i<m;i++){for(long long j=0;j<n;j++){if(d[i][j]){d[i+1][((j-1)+n)%n]+=d[i][j];d[i+1][(j+1)%n]+=d[i][j];}}}cout<<d[m][0];return 0;
} 

传球游戏【NOIP2008普及组】相关推荐

  1. noip2008普及组4题题解-rLq

    (啊啊啊终于补到了今天的作业了) 本题地址: http://www.luogu.org/problem/show?pid=1058 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有 ...

  2. NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)

    题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...

  3. 信息学奥赛一本通 1942:【08NOIP普及组】ISBN号码 | OpenJudge NOI 1.7 29:ISBN号码 | 洛谷 P1055 [NOIP2008 普及组] ISBN 号码

    [题目链接] ybt 1942:[08NOIP普及组]ISBN号码 OpenJudge NOI 1.7 29:ISBN号码 洛谷 P1055 [NOIP2008 普及组] ISBN 号码 [题目考点] ...

  4. P1055 [NOIP2008 普及组] ISBN 号码 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx

    文章目录 P1055 [NOIP2008 普及组] 题解 Java 代码 关键分析 P1055 [NOIP2008 普及组] 题解 题目链接 Java 代码 package luoguTest;imp ...

  5. P1058 [NOIP2008 普及组] 立体图

    题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m \times nm×n的矩形区域,上面有m \ ...

  6. 13-luogu-P1055 [NOIP2008 普及组] ISBN 号码

    文章目录 [NOIP2008 普及组] ISBN 号码 问题 题目描述 输入格式 输出格式 样例 样例输入 样例输出 样例 样例输入 样例输出 #2 提示 小白代码 多次提交,解决 "X&q ...

  7. P1055 [NOIP2008 普及组] ISBN 号码

    P1055 [NOIP2008 普及组] ISBN 号码题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括999位数字.111位识别码和333位分隔符,其规定格式如x-xxx- ...

  8. NOIP2008 普及组T1 ISBN号码 解题报告-S.B.S.

    题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其中符号"-&qu ...

  9. 洛谷P1055题解 [NOIP2008 普及组] ISBN 号码

    原文地址:https://luvletter.blog.luogu.org/p1055-ti-jie 题解 超级简单的一题,就是要注意输入和输出的分隔符的问题以及ASCII码中0~9这10个数字对应的 ...

最新文章

  1. Linux 交叉编译简介
  2. 虚拟主机6大骗术,站长朋友小心了
  3. Mysql事务以及加锁机制事务的特征ACID
  4. java enumset_java.util.EnumSet.allOf()方法和实例的学习
  5. Linux单机安装kafka
  6. 当我们谈数据库时,是在谈什么?
  7. 云计算作业001-电脑配置
  8. Hibernate入门案例及增删改查
  9. Vue二次封装axios为插件使用
  10. oracle log 分析程序,oracle之logminer日志分析
  11. MySql 5.6.21安装及配置(超详细)
  12. python系统学习:第二周之字典应用
  13. 【优化分类】基于matlab改进的人工蜂群算法优化SVM分类【含Matlab源码 1833期】
  14. python 根据关键字 切割pdf_用python拆分pdf
  15. java从键盘读入数据_关于Java中从键盘读入各种数据的方式
  16. amd锐龙CPU A320系列主板如何安装win7
  17. m3u8转换为mp4格式
  18. C语言运算符优先级及结合性
  19. 【学术渣解惑】ICLR是个什么样的会议?
  20. 小程序tabbar能放分包路径吗_微信小程序底部导航Tabbar

热门文章

  1. 没有语言栏 meiyou yuyanlan buneng dahanzi
  2. 写作总结20221016
  3. Linux检查空口令
  4. notepad++ 鼠标箭头显示为 横线“_“
  5. idea 指定文件扩展名中搜索内容
  6. 迪丽热巴晒可爱自拍 大眼wink卖萌电力十足
  7. 降维打击!苹果推廉价版iPhone SE 还让其他厂商活吗?
  8. 分享抖音6个小项目;有人已经日入500+了。丨国仁网络资讯
  9. 关于LayoutInflater.from(context).inflate()的使用的问题
  10. 新环境中奋起的岁月(六)