首页 > 编程语言 >算法 跑步问题 -- 暴力法

算法 跑步问题 -- 暴力法

时间:2024-10-06 12:50:24浏览次数:5  
标签:cnt 20 -- 圈数 int 算法 跑步 ans

目录

跑步问题 - 暴力法

题目

某人准备跑20圈来锻炼自己的身体,他准备分多次(>1)跑完,每次都跑正整数圈,然后休息下再继续跑。 为了有效地提高自己的体能,他决定每次跑的圈数都必须比上次跑的多, 设第一次圈数不能小于0,那么请问他可以有多少种跑完这 20 圈的方案? 输出方案总数,以及每种方案的排序。(比如1,19/ 1,2,17 都是有效方案)

分析

本题用动态规划等方法好做,因为圈数比较小,能够方便使用暴力方案解决;

根据条件:1. 他准备分多次(>1)跑完 2.他决定每次跑的圈数都必须比上次跑的多;分析得出,答案是一系列递增的正数,是排列组合相关问题; 因此大概就是dfs思路了(需要归纳过才好理解,我刚好分析过两篇,有兴趣可以看看;C++算法题解 - 递归实现排列型枚举 - 递归法 (图文) (递归搜索树) - HJfjfK - 博客园 (cnblogs.com));

规律

画出来才清晰

1 2 3 4 5 = 15, +6=21 (不满足)
1 2 3 4 6 = 16,(不满足)
1 2 3 4 7 = 17,(不满足)
1 2 3 4 8 = 18,(不满足)
1 2 3 4 9 = 19,(不满足)
1 2 3 4 10 = 20(满足)

1 2 3 5 6 = 17, +7>20 (不满足)
1 2 3 5 7 = 18,				(不满足)
1 2 3 5 8 = 19,				(不满足)
1 2 3 5 9 = 20(满足)
...
2 3 4 5 6 = 20(满足)
2 3 4 6 = 15, +7=22(不满足)
2 3 4 7 = 16,
...
19,(不满足)
20,(不满足)

代码实现

1. 初步框架

细节处理比较粗糙,看看思路即可

## 命名不够专业,凑合凑合
const int N = 20;       //要跑20圈
int size = 0;           //方案数


dfs(下一次待跑圈数,已跑圈数)		##初步确定dfs递归参数,可以有多种方式,选择自己习惯的

int main() {
    std::vector<int> v; //映射方式;(或用栈或顺序表模拟栈 放入每次待跑圈数)
    v.resize(21, 0);	//扩容并初始化,或者直接使用定长数组

    //第一步的圈数,范围1到20圈
    for (int i = 1; i <= N; i++) {
        dfs(i, 0, v);
    }
    
    std::cout<<"总方案数: "<<size << std::endl;
    return 0;
}

2. dfs

  1. 找递归出口,分别是不满足返回,和满足打印并返回
  2. 递归遍历(排列组合常用方案)
  3. 数组记录; 细节:注意要回溯
  4. 边界优化,时间足够的情况下,可以找规律分析分析;时间紧的时候,紧张不好想就直接干了
//dfs(下一次待跑圈数,已跑圈数)
void dfs(int cnt, int ans, std::vector<int>& v) {
    if (ans + cnt  > 20)     //
    {
        出口
    }
    if (ans + cnt == 20) 
    {
        出口
    }

    v[cnt] = 1; //可以跑
    for (int i = cnt+1; i < N-ans; i++)      //在上一段规律细心分析可以发现,小于上一次的就不需要再遍历了,然后继续画下图分析规律,结果只需要遍历大于上一次,小于20的即可;
     /*
     i<N-ans,规律
     (more) (next)
      [1  --  19 =20-1] ->  [1,2 -- 17=20-3]      [1,2,3 -- 14=20-6]  即 ans(已跑圈数) <--> N-ans(要跑圈数)
      2  --  18 
      3  --  17
      ...
    */
   {
        dfs(i, ans+cnt, v); //下一次执行(待跑圈数,已跑圈数);
    }
    v[cnt] = 0; //回溯
}

3. 补全

#include<iostream>
#include<vector>

const int N = 20;       //要跑20圈
int size = 0;           //方案数

void Print(const std::vector<int>& v) {
    for (int i = 1 ; i<v.size();i++) {
        if (v[i] == 1) std::cout << i << " " ;
    }
    std::cout<<std::endl;
}

//dfs(下一次待跑圈数,已跑圈数)
void dfs(int cnt, int ans, std::vector<int>& v) {
    if (ans + cnt  > 20)     //
    {
        return ;
    }
    if (ans + cnt == 20) 
    {
        v[cnt] = 1;
        Print(v);
        v[cnt] = 0; //回溯
        size++;
        return ;
    }

    v[cnt] = 1; //可以跑
    for (int i = cnt+1; i < N-ans; i++)      
    /*
     i<N-ans,规律
     (more) (next)
      1  --  19    1,2 -- 17      1,2,3 -- 14  即 ans(已跑圈数) <--> N-ans(要跑圈数)
      2  --  18 
      3  --  17
      ...
    */
    {
        dfs(i, ans+cnt, v); //下一次执行(待跑圈数,已跑圈数);
    }
    v[cnt] = 0; //回溯
}

int main() {
    std::vector<int> v; //映射方式;(或用栈或顺序表模拟栈)
    v.resize(21, 0);

    //第一步的圈数,范围1到20圈
    for (int i = 1; i <= N; i++) {
        dfs(i, 0, v);
    }
    std::cout<<"总方案数: "<<size << std::endl;
    return 0;
}

标签:cnt,20,--,圈数,int,算法,跑步,ans
From: https://www.cnblogs.com/DSCL-ing/p/18448989

相关文章

  • 《计算机基础与程序设计》第二周学习总结
    学期(2024-2025-1)学号(20241412)《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第一周作业)作业正文https://www.cnblo......
  • ICPC2023沈阳K
    https://codeforces.com/gym/104869/problem/KDS题尽量进一步思考,简化维护过程权值线段树上二分首先得出一个显然的转化:对于每次操作,求出此次下所有正数从小到大的前缀和的第一次大于所有负数和的绝对值的位置即为答案。赛时做法既然要求每次都求a升序下的前缀和,很显然的想......
  • 游戏试玩全自动挂机撸金项目
    项目概述游戏试玩平台全自动挂机项目利用自动化脚本技术,项目特点自动化操作:通过脚本自动执行试玩任务,减少人工干预。设备需求电脑云手机:项目需要使用电脑云手机,以支持多窗口单IP的运行环境。单窗口单IP:每个窗口都需要独立的IP地址,以避免被平台检测到异常行为。......
  • 黑科技全自动协议挂机项目
    文介绍了一款能够自动化管理多个账号并执行广告观看任务的软件,该软件支持批量导入账号,一键运行,并能在后台挂机使用,同时不影响手机的正常操作。软件概述批量账号广告观看自动化软件是一款高效的工具,旨在帮助用户自动化地管理大量账号的广告观看任务,提高效率并减少人工操......
  • 递归_字符串匹配,最长连续序列
    1:字符串匹配题目链接:LCR137.模糊搜索验证-力扣(LeetCode)可以使用递归的方法来检查 input 是否可以匹配 article。目的是正确处理两种通配符:‘.’和‘*’的匹配规则。defis_match(article:str,input:str)->bool:ifnotinput:returnnotarticle......
  • Java内存模型
    1.硬件的效率与一致性物理机遇到的并发问题与虚拟机中的情况有很多相似之处,物理机对并发的处理方案对虚拟机的实现也有相当大的参考意义。“让计算机并发执行若干个运算任务”与“更充分地利用计算机处理器的效能”之间的因果关系,看起来理所当然,实际上它们之间的关系并没有想象......
  • 使用vscode写博客
    原文之前写博客用的是Hugo+Obsidian,Obsidian作为一个markdown所见即所得的笔记软件,配置好相关插件后写博客还是很舒服的,比如我用的最多的就是粘贴截图并且自动保存图片,快速创建博客模板。但是我发现用它写博客还是不太得劲,除了我懒以外,问题出在Obsidian(0.14.15)不能像vscode等编......
  • 洛谷 P3523 题解
    洛谷P3523[POI2011]DYN-Dynamite分析二分答案,问题转化为:对于给定的\(K\),选择尽可能少的节点,使得所有关键节点都被「覆盖」。对于一个关键节点,「覆盖」的定义为:存在一个被选择的点与这个关键节点的距离不大于\(K\)。方便起见,我们指定\(1\)号节点是这棵树的根节点。我们......
  • HIS系统,HIS系统源码
    HIS系统在医院信息化建设中扮演着核心的角色。它是一个综合性的信息系统,旨在管理和运营医院的各种业务,包括门诊、住院、财务、物资、科研等。HIS系统的整体组成门诊管理:包括挂号、排班、收费结算等功能。住院管理:包括患者入院、出院、床位管理、医嘱执行等。药房管理:包括药品库存管......
  • 全面图解Docker架构设计:掌握Docker全链路思维与优化(命令篇)
    Docker是一个革命性的开放平台,用于开发、交付和运行应用程序。通过使用Docker,开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何支持Docker的环境中,在不同环境中实现一致的运行。无论是在虚拟机、物理服务器、数据中心还是云平台,Docker都能确保......