NOIP2008 普及组T3 传球游戏 解题报告-S.B.S.

题目描述

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

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

聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有三个同学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

2008普及组第三题

---------------------------------------我是华丽丽的分割线----------------------------------------------------------------

水题,刚看到时容易想到无脑暴搜,每一位上枚举其右边位置与左边位置。

但是写出代码来容(一)易(定)超时(只能过4~5个点),暴搜代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<cstdlib>
 8 using namespace std;
 9 int n,m,ans=0;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
13     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
14     return x*f;
15 }
16 void search(int,int);
17 int main()
18 {
19     std::ios::sync_with_stdio(false);
20     cin>>n>>m;
21     search(1,0);
22     cout<<ans;
23     return 0;
24 }
25 void search(int d,int c)
26 {
27     int a,b;
28     a=d-1;b=d+1;
29     if(d==1) a=n;if(d==n) b=1;
30     if(c==m&&d==1) ans++;
31     if(c<m)
32     {
33         c+=1;
34         search(a,c);
35         search(b,c);
36         c-=1;
37     }
38 }

因为超时,再回去看题目,发现每一个状态都可以用前一个推出来,

而且符合无后效性,所以考虑动规,代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<cstdlib>
 8 using namespace std;
 9 int dp[33][33];
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
13     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
14     return x*f;
15 }
16 int main()
17 {
18     std::ios::sync_with_stdio(false);
19     int n,m;
20     cin>>n>>m;
21     for(int i=1;i<=n;i++)
22         dp[i][min(i-1,31-i)]=1;
23     for(int j=1;j<=m;j++)
24      for(int i=1;i<=n;i++)
25      {
26         if(i==1) dp[1][j]=dp[n][j-1]+dp[2][j-1];
27         if(i==n) dp[i][j]=dp[1][j-1]+dp[i-1][j-1];
28         if(i>1&&i<n) dp[i][j]=dp[i-1][j-1]+dp[i+1][j-1];
29      }
30     cout<<dp[1][m]<<endl;
31     return 0;
32 }

所以说,不要看见题目数据范围小就立马无脑暴搜,

还是要先考虑高效算法才能保证拿到分数。

时间: 2024-10-17 18:23:40

NOIP2008 普及组T3 传球游戏 解题报告-S.B.S.的相关文章

noip2008普及组t3传球游戏

简单dp dp[i][j]表示第i个人在j次传球前的状态 注意i=1 i=n时特殊处理 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> using namespace std; int n,m,f[35][35]; int read() { int x=0,f=1; c

NOIP2008 普及组T2 排座椅 解题报告-S.B.S

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道.于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么

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

题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第二个分隔符后的五位数字代表该书在该出版社的编号:最后一位为识别码. 识别码的计算方法如下: 首位数字乘以

NOIP2012普及组 (四年后的)解题报告 -SilverN

本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告成AC后,看到别人的解题报告说fl能过只是因为测试数据范围小. 好像主要有三种解法,fl,dij,dfs dfs暂时弃,dij写到现在还没完成,先把fl的放上来. 等攻下T4,再施工前面三道题 T4-Floyd: 读完数据以后,只要把文化不兼容的城市的路都堵上,就可以用floyd了 可怜我之前堵路无

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

题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放: 每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示.字符’+’,”-”,”/”,”|”的ASCII

NOIP2008普及组 题解 -SilverN

T1 ISBN号码 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符, 其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标 准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第 二个分隔符后的五位数字代表该书在该出版社的编号:最后一位为识别码. 识别码的计

noip2008普及组4题题解-rLq

(啊啊啊终于补到了今天的作业了) 本题地址:http://www.luogu.org/problem/show?pid=1058 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图.小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:每个顶

CSU-ACM2014暑假集训基础组训练赛(1) 解题报告

•Problem A HDU 4450                 水题,签到题 水题..没啥好说的.给大家签到用的. 1 #include <cstdio> 2 int main(){ 3 int n,a,ans; 4 while(scanf("%d",&n),n){ 5 ans = 0; 6 for(int i = 0;i < n;i++){ 7 scanf("%d",&a); 8 ans += a*a; 9 } 10 pr

CSU-ACM暑假集训基础组训练赛(4)解题报告

•Problem A SPOJ SUB_PROB   AC自动机 •题意: 给定一个长为M(M≤100000 )的文本串,和N(N≤1000)个长度不超过2000的模式串,问每个模式串是否在文本串中出现过? •几乎和周一课件上的第一个例题一模一样.. •把文本串丢到AC自动机里面去跑. •注意: •1.可能有两个相同的模式串(略坑吧.) •2.一个模式串可能是另一个模式串的后缀,即如果一个点的fail指针指向的点是一个“危险节点”,那么它本身也是一个“危险节点”. 1 #include <ios