算法分析与设计 专题三

目录

一、实验目的

二、实验内容

三、问题分析与求解

四、AC源代码、截图

五、实验小结


一、实验目的

1、了解贪心算法的分析过程,学会用贪心算法解决一些具体的问题。

2、了解广度优先算法和深度优先算法。

、实验内容

  1. 1992

当然,我们的收藏中至少需要一个电脑游戏。典型的可以说是“镇上追逐”。在我们的案例中,笑脸叫杰克,正在穿过分成小田野的小镇。有些田地被墙覆盖,无法穿过它们。杰克收集积分,并试图避免与追逐他的怪物接触。一旦杰克吃了特殊点(或星号),情况就会颠倒过来,杰克可以吃怪物。以此类推,一次又一次。我相信你们每个人都见过这样的游戏。

在我们的例子中,城镇是随机生成的。杰克总是从左上角开始,“奖励星号”在右下角。在最困难的关卡中,只要杰克只向左和向下走几步,奖金就会消失,这些步数恰好足以从一个角落到另一个角落。如果他朝着错误的方向迈出一步,他永远无法及时到达那里。但防止被怪物抓住仍然很重要。因此,玩家必须选择最好的方式到达右下角。你要确定镇上有多少种不同的方式。

  1. 1042

约翰要去钓鱼。他有 h 小时可用 (1 <= h <= 16),该地区有 n 个湖泊 (2 <= n <= 25),都可以沿着一条单行道到达。约翰从1号湖开始,但他可以在任何他想要的湖结束。他只能从一个湖到下一个湖,但除非他愿意,否则他不必在任何湖停留。对于每个 i = 1,...,n - 1,从湖泊 i 到湖泊 i + 1 所需的 5 分钟间隔数表示为 ti (0 < ti <=192)。例如,t3 = 4 表示从湖 3 到湖 4 需要 20 分钟。为了帮助计划他的钓鱼之旅,约翰收集了一些关于湖泊的信息。对于每个湖泊i,预计在最初的5分钟内捕获的鱼的数量,记作fi(fi >= 0),是已知的。

每钓鱼 5 分钟,预计在接下来的 5 分钟间隔内捕获的鱼数量就会以恒定的 di (di >= 0) 速率减少。如果预计在一个区间内捕获的鱼的数量小于或等于di,则在下一个区间内湖中将不再有鱼。为了简化计划,约翰假设没有其他人会在湖边钓鱼,以影响他预计捕获的鱼的数量。

编写一个程序来帮助约翰计划他的钓鱼之旅,以最大限度地增加预期捕获的鱼的数量。在每个湖泊花费的分钟数必须是 5 的倍数。

问题分析与求解

1.1992分析与求解:

       这道题是问你有多少种能最快到达终点的方法。注意这里的最快不是相对是最快。而是路线只能向右或者向下 不允许向上或者向左走。

2.1042分析与求解:

       我们可以把总时间分为两个部分:在路上的时间和在钓鱼的时间。由于路是单行的,所以在路上的时间取决于走的最远距离,即到达的池塘的最大编号。 剩余的时间用于钓鱼。我们可以把移动+钓鱼的混合过程拆分为移动的过程和钓鱼的过程,即指定一个池塘为终点,移动过程即从起点到终点的过程,钓鱼的过程就是从起点到终点的各个池塘中选择池塘钓鱼,因为移动过程所需的时间已经在前面考虑过了,这个时候我们就可以认为需要移动的时候可以直接瞬间到达。然后,选择到哪些池塘钓鱼的策略采用贪心的方法,每个钓鱼的5分钟都选择期望最大的那一个池塘,每在选择一个池塘钓鱼5分钟,减少相应池塘的期望,增加计划中在该池塘钓鱼的时间,然后继续选择期望最大的池塘,直到钓鱼的时间不够,或者池塘里没有鱼了。如果池塘没有鱼了,还有时间的话,把多余的时间分配给第一个池塘。

四、AC源代码、截图

#include<stdio.h>
#include<malloc.h>
#include<string.h>typedef struct{int x, y;
}Point;typedef struct{Point Q[1100];int top, tail;
}Que;
Que q;void ini() {q.top = 0, q.tail = 0;}
void push(int x, int y) {q.Q[q.tail].x = x, q.Q[q.tail].y = y;q.tail++; if(q.tail > 1099) q.tail = 0;}
Point pop() {Point tt; tt = q.Q[q.top++]; if(q.top > 1099) q.top = 0; return tt;}
bool empty() {if(q.tail == q.top) return 1; return 0;}int R, S;
bool map[1005][1005];
int f[1005][1005];int main()
{int Case;int i, j;char x;Point tt;while(scanf("%d", &Case) != EOF){while(Case--){scanf("%d%d", &R, &S);for(i = 0; i < R; ++i){getchar();for(j = 0; j < S; ++j){scanf("%c", &x);map[i][j] = (x == '.'? 1 : 0);f[i][j] = 0;}}push(0, 0);f[0][0] = 1;while(!empty()){tt = pop();if(map[tt.x + 1][tt.y]){if(!f[tt.x + 1][tt.y]) push(tt.x + 1, tt.y);f[tt.x + 1][tt.y] += f[tt.x][tt.y];}if(map[tt.x][tt.y + 1]){if(!f[tt.x][tt.y + 1]) push(tt.x, tt.y + 1);f[tt.x][tt.y + 1] += f[tt.x][tt.y];}}printf("Existuje %d ruznych cest.\n", f[R - 1][S - 1]);}}return 0;
}

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;const int N=25;
int n,h;
int f[N],d[N],t[N];//f第一个五分钟钓的鱼量,d为每个五分钟减少的鱼量,t为i到i+1五分钟的个数 
int ans;
int each[N];//记录最终每条湖用的时间
int tans,teach[N];//最优钓鱼量和各湖钓鱼时间 
int th,tf[N];//有效钓鱼时间和每条湖前五分钟的钓鱼量 int main()
{int i,j;while(cin>>n&&n>0){//当湖的数量为0的时候结束 cin>>h;//输入时间 for(i=0;i<n;i++){cin>>f[i];//第一次的鱼量 } for(i=0;i<n;i++){cin>>d[i];//每五分钟减少的鱼量 }for(i=0;i<n-1;i++){cin>>t[i];//每个湖间距离需要的时间片 }h*=12;//一小时12个时间片ans=-1;for(i=0;i<n;i++){//表示再第i条湖停下来 //初始化每一次贪心th=h;//有效时间先初始化为总时间 for(j=0;j<n;j++){tf[j]=f[j];//每条湖初始的钓鱼量初始为第一次五分钟的钓鱼量 teach[j]=0;//每个湖的钓鱼时间初始化为0 } tans=0;//最大钓鱼数初始化为0 //对每五分钟贪心选择钓鱼量最大的湖钓鱼 while(th>0){//当有效时间大于0 int ind=0,max=tf[0];//令第一条湖的鱼量为最大值 ,ind标记湖是第几条湖 for(j=0;j<=i;j++){if(tf[j]>max){//不考虑顺序先找第一次鱼量最大的湖 max=tf[j];ind=j;}}if(max==0){//最大钓鱼量为0时,将剩余的钓鱼时间加到第一个湖上的钓鱼时间 teach[0]+=th*5;//例如样例一 break;}else{teach[ind]+=5;//最大湖的钓鱼时间,每钓一次加一次五 tans+=tf[ind];//加上最大鱼量的湖的该次的鱼数 if(tf[ind]>=d[ind])//如果鱼量不少于减少的鱼数 ,则减 {tf[ind]-=d[ind];}else{tf[ind]=0;//小于减少数则赋值为0 }} th--;//有效时间减少一个时间片(一个时间片五分钟) }if(i!=n-1){//i的话是表示在第i条湖停下来 h-=t[i];//减去到下一条湖的时间片 }if(tans>ans){//如果值大于前面的值,就把值赋给ans ans=tans;for(j=0;j<n;j++){each[j]=teach[j];//记录最终每条湖用的时间 }}} cout<<each[0]; for(i=1;i<n;i++){cout<<", "<<each[i];}cout<<endl;cout<<"Number of fish expected: "<<ans<<endl;cout<<endl;}return 0;
} 

五、实验小结

1.迷宫问题最短路径问题中,每次处理的位置所对应的距离是严格递增的,因此,一旦找到终点,当前的距离就是最短距离,

搜索可移动到的位置中,判断条件不仅仅是不碰壁不超边界,还有一个条件就是没有到达过。因为,如果已经到达了这个位置,这说明已经有更短的路径到达了这个位置,这次到达这个位置的路径是更远的,不可能达到最优解;

2.贪心算法存在的问题:

(1)不能保证求得的最后解是最佳的;
2不能用来求最大值或最小值的问题
3只能求满足某些约束条件的可行解的范围

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1688商品详情接口:深度解析与应用实践

在电商领域&#xff0c;1688作为中国领先的B2B平台&#xff0c;拥有海量的商品信息。对于开发者、商家和数据分析师来说&#xff0c;获取1688商品的详细信息是实现数据分析、竞品研究、自动化管理和精准营销的重要手段。本文将详细介绍1688商品详情接口的使用方法、技术细节以及…

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说&#xff0c;我们首先定位到 left 位置节点的前一个节点 prev。然后&#xff0c;从 left 位置…

C语言中的位域:节省内存的标志位管理技术

位域&#xff08;Bit-field&#xff09; 是 C 语言中的一种特性&#xff0c;允许在结构体&#xff08;struct&#xff09;中定义占用特定位数的成员变量。通过位域&#xff0c;可以更精细地控制内存的使用&#xff0c;尤其是在需要存储多个布尔值或小范围整数时&#xff0c;可以…

【AI编程学习之Python】第一天:Python的介绍

Python介绍 简介 Python是一种解释型、面向对象的语言。由吉多范罗苏姆(Guido van Rossum)于1989年发明,1991年正式公布。官网:www.python.org Python单词是"大蟒蛇”的意思。但是龟叔不是喜欢蟒蛇才起这个名字,而是正在追剧:英国电视喜剧片《蒙提派森的飞行马戏团》(Mo…

【openstack系列】虚拟化技术

OpenStack 是一个开源的云计算管理平台,它本身并不直接提供虚拟化技术,而是通过集成不同的虚拟化解决方案来管理和编排计算、存储和网络资源。OpenStack 的核心优势在于其灵活性和可扩展性,支持多种虚拟化技术(Hypervisor),使企业可以根据需求选择合适的底层虚拟化方案。…

保姆级教程:Vue3 + Django + MySQL 前后端联调(PyCharm+VSCode版)

一、环境准备与验证 这里为减少篇幅&#xff0c;默认大家都安装好了这些软件。不会下载安装的&#xff0c;教程也很多&#xff0c;这里不再做赘述。话不多说&#xff0c;咱们开始&#xff1a; 1. 安装验证 确保已安装以下软件并验证版本&#xff1a; # 验证Node.js node -v…

Spring Data审计利器:@LastModifiedDate详解!!!

&#x1f552; Spring Data审计利器&#xff1a;LastModifiedDate详解&#x1f525; &#x1f31f; 简介 在数据驱动的应用中&#xff0c;记录数据的最后修改时间是常见需求。Spring Data的LastModifiedDate注解让这一过程自动化成为可能&#xff01;本篇带你掌握它的核心用法…

洛谷题单1-P1001 A+B Problem-python-流程图重构

题目描述 输入两个整数 a,b&#xff0c;输出它们的和&#xff08;∣a∣,∣b∣≤109&#xff09;。 输入格式 两个以空格分开的整数。 输出格式 一个整数。 输入输出样例 输入 20 30输出 50方式-print class Solution:staticmethoddef oi_input():"""从…

CCF CSP 第33次(2024.03)(2_相似度计算_C++)(字符串中字母大小写转换+哈希集合)

CCF CSP 第33次&#xff08;2024.03&#xff09;&#xff08;2_相似度计算_C&#xff09; 题目背景&#xff1a;题目描述&#xff1a;输入格式&#xff1a;输出格式&#xff1a;样例1输入&#xff1a;样例1输出&#xff1a;样例1解释&#xff1a;样例2输入&#xff1a;样例2输出…

Windows .gitignore文件不生效的情况排查

概述 今天下班在家里捣腾自己的代码&#xff0c;在配置.gitignore文件忽略部分文件的时候&#xff0c;发现死活不生效 问题根源 经过一通分析和排查才发现&#xff0c;是.gitignore文件的编码错了&#xff0c;刚开始还没注意到&#xff0c;因为是在Windows下开发&#xff0c…

Uniapp自定义TabBar组件全封装实践与疑难问题解决方案

前言 在当前公司小程序项目中&#xff0c;我们遇到了一个具有挑战性的需求&#xff1a;根据不同用户身份动态展示差异化的底部导航栏&#xff08;TabBar&#xff09; 。这种多角色场景下的UI适配需求&#xff0c;在提升用户体验和实现精细化运营方面具有重要意义。 在技术调研…

四川省汽车加气站操作工备考题库及答案分享

1.按压力容器的设计压力分为&#xff08; &#xff09;个压力等级。 A. 三 B. 四 C. 五 D. 六 答案&#xff1a;B。解析&#xff1a;按压力容器的设计压力分为低压、中压、高压、超高压四个压力等级。 2.缓冲罐的安装位置在天然气压缩机&#xff08; &#xff09;。 A. 出口处 …

2025年- G27-Lc101-542. 01 矩阵--java版

1.题目描述 2.思路 总结&#xff1a;用广度优先搜索&#xff0c;首先要确定0的位置&#xff0c;不为0的位置&#xff0c;我们要更新的它的值&#xff0c;只能往上下左右寻找跟它最近的0的位置。 解题思路 我们用 BFS&#xff08;广度优先搜索&#xff09;求解&#xff0c;因为 …

CANopen基本理论

目录 一、CANopen简介 二、OD对象字典 2.1 OD对象字典简介 2.2 CANopen预定义连接集 三、PDO过程数据对象 四、SDO过程数据对象 五、特殊协议 5.1 同步协议 5.2 时间戳协议 5.3 紧急报文协议 六、NMT网络管理 6.1 NMT节点状态 6.2 NMT节点上线报文 6.3 NMT心跳报…

【Zookeeper搭建】Zookeeper分布式集群搭建完整指南

Zookeeper分布式集群搭建 &#xff08;一&#xff09;克隆前准备工作 一、时钟同步 步骤&#xff1a; 1、输入date命令可以查看当前系统时间&#xff0c;可以看到此时系统时间为PDT&#xff08;部分机器或许为EST&#xff09;&#xff0c;并非中国标准时间。我们在中国地区…

MVC基础概念及相应代码示例

&#xff08;旧的&#xff09;代码实现方法 一个功能模块的代码逻辑&#xff08;显示处理&#xff0c;数据处理&#xff0c;逻辑判定&#xff09;都写在一起(耦合) &#xff08;新的&#xff09;代码MVC分层实现方法 显示部分实现&#xff08;View视图&#xff09; 数据处理实…

nginx优化(持续更新!!!)

1.调整文件描述符 # 查看当前系统文件描述符限制 ulimit -n# 永久修改文件描述符限制 # 编辑 /etc/security/limits.conf 文件&#xff0c;添加以下内容 * soft nofile 65535 * hard nofile 65535# 编辑 /etc/sysctl.conf 文件&#xff0c;添加以下内容 fs.file-max 655352.调…

apache连接池机制讨论

apache连接池的连接有效性 server一般会配置keep-alive超时时间&#xff0c;过了这个时间还没新请求到来&#xff0c;则关闭连接。客户端从连接池里拿出连接时&#xff0c;会检查一下连接是否已关闭&#xff0c;如已关闭&#xff0c;会丢弃掉该连接&#xff0c;并尝试从连接池…

【QT5 多线程示例】条件变量

文章目录 条件变量使用 wakeOne()使用 wakeAll() 条件变量 QT的条件变量类是QWaitCondition&#xff0c;有wakeOne() 和 wakeAll() 两个方法 wakeOne()&#xff1a;仅唤醒一个等待的线程。wakeAll()&#xff1a;唤醒所有等待的线程。 使用 wakeOne() https://github.com/Bi…

备赛蓝桥杯之第十六届模拟赛第1期职业院校组第四题:世纪危机(人口增长推算)

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…