首页 > 其他分享 >CSP历年复赛题-P1057 [NOIP2008 普及组] 传球游戏

CSP历年复赛题-P1057 [NOIP2008 普及组] 传球游戏

时间:2024-05-27 18:00:11浏览次数:13  
标签:pre 传球 cnt int NOIP2008 next P1057 CSP dp

原题链接:https://www.luogu.com.cn/problem/P1057

题意解读:n个人围一圈,从1开始传球m次,每次可以往左或右传,计算球再次传给1的方案数。

解题思路:

求方案数,通常就是DP问题,此题DP状态并不难想,如果实在不会,也可以通过DFS暴搜得部分分。

1、DFS

60分代码:

#include <bits/stdc++.h>
using namespace std;

int n, m, ans;

//经过cnt次传球到x
void dfs(int cnt, int x)
{
    if(cnt == m)
    {
        if(x == 1) ans++;
        return;
    }

    int next = x + 1; //下一次传给x+1
    if(next > n) next = 1;
    dfs(cnt + 1, next);

    int pre = x - 1; //下一次传给x-1
    if(pre < 1) pre = n;
    dfs(cnt + 1, pre);
}

int main()
{
    cin >> n >> m;
    dfs(0, 1);
    cout << ans;

    return 0;
}

2、动态规划

状态表示:

  设dp[i][j]表示经过i次球从1传到j的方案数

状态转移:

  考虑i-1次的情况,i-1传球可以传到j-1,也可以传到j+1,

  因此可以得到dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]

  但是需要考虑j的取值,当j == 1时 j - 1替换为n,当j == n时,j + 1替换为1

初始化:

  dp[0][1] = 1,0次传球到1的方案是1

结果:

  dp[m][1],m次传球到1的方案数

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 35;

int n, m;
int dp[N][N]; //dp[i][j]表示经过i次球从1传到j的方案数

int main()
{
    cin >> n >> m;
    dp[0][1] = 1;
    for(int i = 1; i <= m; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(j == 1) dp[i][j] += dp[i-1][n];
            else dp[i][j] += dp[i-1][j-1];

            if(j == n) dp[i][j] += dp[i-1][1];
            else dp[i][j] += dp[i-1][j+1];
        }
    }
    cout << dp[m][1];

    return 0;
}

 

标签:pre,传球,cnt,int,NOIP2008,next,P1057,CSP,dp
From: https://www.cnblogs.com/jcwy/p/18216155

相关文章

  • CSP历年复赛题-P1055 [NOIP2008 普及组] ISBN 号码
    原题链接:https://www.luogu.com.cn/problem/P1055题意解读:验证ISBN最后一位是否正确。解题思路:直接模拟,不多说,上代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;intcode=0;intcnt=0;for(inti......
  • CSP历年复赛题-P1096 [NOIP2007 普及组] Hanoi 双塔问题
    原题链接:https://www.luogu.com.cn/problem/P1096题意解读:汉诺双塔的移动次数,与经典汉诺塔的区间在于同一个尺寸盘子有两个。解题思路:可以直接用经典汉诺塔方法来计算,双塔的结果就最终乘以2即可。首先想到的是递归,但是由于数据量n最大200,递归会超时,但是50%的样例应该没问题,先......
  • CSP历年复赛题-P1095 [NOIP2007 普及组] 守望者的逃离
    原题链接:https://www.luogu.com.cn/problem/P1095题意解读:在有限的时间内,通过跑步或者闪烁两种方式,能跑出的最远距离是多少,以及是否能跑出出口。解题思路:1、贪心法每一秒钟,都有两种选择:跑步(17米)、闪烁(60米,前提是蓝够10点,否则等待1s恢复4点蓝)经过计算,恢复足够的蓝到闪烁需要3.......
  • 【csp202403-1】词频统计【第33次CCF计算机软件能力认证】
    问题描述在学习了文本处理后,小P对英语书中的......
  • CSP历年复赛题-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先一大、一小,如果价格之和不超限,则分为一组,如果超限,则大的单独分为一组,重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格不是和最......
  • CCF-CSP认证 2024年3月 4.化学方程式配平
    题解:首先完成数据的读入,然后高斯消元求秩按题意解即可#pragmaGCCoptimize(2,3,"Ofast","inline")#include<bits/stdc++.h>usingnamespacestd;constintmaxn=100;usingmatrix=double[maxn][maxn];usingvect=array<double,maxn>;constdoub......
  • P5662 [CSP-J2019] 纪念品
    原题链接题解定义\(dp[i]\)为今天有\(i\)元钱花时,明天卖能纯赚多少钱(这里有一个递归的思想,不需要考虑\(dp[k-a[i][j]]\)能否买得起今天的产品)如果\(dp[i-1]=k\)那么\(dp[i]\geqk\),所以存在一个\(i\)使得钱全部花完然后赚\(k\)元code#include<bits/stdc++.h>u......
  • mx 五月 csp-j
    T1考虑只有第二种操作。显然可以维护\(a_i\)代表当前序列的第\(i\)个数是什么。观察到变换只和\(k\%3\)的值有关。对于第一种操作,显然可以令\(k\leftarrowk\%n\)。观察到这种变换将整个序列视为一个环更方便一点,于是维护变换后第一个数的下标是多少。输出时按照环的......
  • CSP历年复赛题-P1061 [NOIP2006 普及组] Jam 的计数法
    原题链接:https://www.luogu.com.cn/problem/P1061题意解读:从编号s~t的字母从挑w个,组成一种特殊的数字,数字里字母都是升序的,给定初始数字,要计算后5个。解题思路:1、模拟法模拟样例:2105有效字母范围:b,c,d,e,f,g,h,i,j 初始值:bdfij要计算bdfij的下一个,采取如下步骤......
  • 洛谷[普及]:P1149 [NOIP2008 提高组] 火柴棒等式
    [NOIP2008提高组]火柴棒等式感谢题目提供者CCF_NOI题目描述给你n 根火柴棍,你可以拼出多少个形如A+B=C 的等式?等式中的A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字 的拼法如图所示:注意:1.加号与等号各自需要两根火柴棍;2.如果,则......