计算机算法分析与设计(15)---贪心算法(虚拟汽车加油问题和最优分解问题)

news2024/10/7 3:21:34

文章目录

  • 一、虚拟汽车加油问题
    • 1.1 问题描述
    • 1.2 思路分析
    • 1.3 代码编写
  • 二、最优分解问题
    • 2.1 问题描述
    • 2.2 思路分析
    • 2.3 代码编写


一、虚拟汽车加油问题

1.1 问题描述

 一辆虚拟汽车加满油后可行驶 n n n km。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少,计算最少加油次数。

数据输入:
第一行有两个整数n和k,表示汽车加满油后可行驶n km,且路途中有k个加油站。接下来的一行中有k+1个整数,表示第k个加油站与k-1个加油站之间的距离。第0个加油站表示处出发地,汽车已加满油,第k+1个加油站便是目的地。
数据输出:
将计算的最少加油次数输出,如果无法到达目的地,则输出 “No Solution”。

1.2 思路分析

 贪心策略:只要汽车能赶到下一个加油站,就不用加油;否则在当前加油站加满油再出发。

1.3 代码编写

样例输入:
7 7
1 2 3 4 5 1 6 6
样例输出:
4

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
 
int main(){
	int n,k;
	cin>>n>>k;
	
	int a[k+1];
	for(int i=0; i<k+1; i++){
		cin>>a[i];
	}
		
	bool f=0;
	int sum=0,gas=n; //gas表示当前的油还可以走多少km
	for(int i=0; i<k+1; i++)
	{
		if(n<a[i])//出现两个加油站之间距离大于n则肯定到达不了目的地 
		{
			f=1;
		}
		if(gas<a[i])//当前的油不够行驶 
		{
			sum++; 
			gas=n;
		}
		gas=gas-a[i];
	}
	
	if(f)
	{
		cout<<"No Solution\n";
	}
	else
	{
		cout<<"最少加油次数:"<<sum<<endl;
	}
	return 0;
}

在这里插入图片描述

二、最优分解问题

2.1 问题描述

 设 n n n 是一个正整数。现在要求将 n n n 分解为若干互不相同的自然数的和,且使这些自然数的乘积最大。

数据输入:
输入一个正整数n。
数据输出:
输出计算得出的最大乘积。

2.2 思路分析

 1. 整数的一个性质:若 a + b = N ( 常数 ) a + b =N(常数) a+b=N(常数),则 ∣ a − b ∣ | a - b | ab 越小, a ∗ b a * b ab 越大

 2. 分析: n n n 为整数相加之和,常数不变。 ( a + b ) 2 = ( a − b ) 2 + 4 a b = n 2 — > a b = ( n 2 − ( a − b ) 2 ) / 4 (a+b)^2 = (a-b)^2 +4ab =n^2 —> ab=(n^2 -(a-b)^2)/4 a+b)2=(ab)2+4ab=n2>ab=(n2(ab)2)/4;所以若 a + b = 常数 a+b=常数 a+b=常数,则 a − b a-b ab 的绝对值越小, a b ab ab 值越大。

 3. 思路:因为要使乘积最大,所以要尽量分解为相似大小的数。分解时,因数从 2 2 2 开始,每次加 1 1 1 n = n − a [ i ] n=n-a[i] n=na[i],保证剩下的数比下一次的数大。
 所以最优分解为从 2 2 2 开始连续的自然数最好,最终分解剩余了一个余数,从分解的最后项依次加 1 1 1 即可(这样乘积中大的数会更大,总的乘积会更大)。

 4. 例如:分解 13 13 13 分解为 2 、 3 、 4 2、3、4 234,还剩下 4 4 4,不够继续分解的下一个数 5 5 5,就把 4 4 4 依次分配给前面的因子,分配顺序是 4 = > 3 = > 2 4 => 3 => 2 4=>3=>2。所以最终结果为 3 、 4 、 6 3、4、6 346,这就是最大乘积的因子。(分配顺序为从大到小,如果还剩下,就继续分配,直到分完变为 0 0 0 为止)。

2.3 代码编写

样例输入:
10
样例输出:
30

#include<iostream>
using namespace std;

int main()
{
    int a[100];
    int n,i=1,j;
    int sum=1;     
    cin>>n;
    
    a[0]=2;
    n=n-a[0];
    while(n>a[i-1]) //a[i-1]=2
    {
        a[i]=a[i-1]+1; //第二个因子是3,往后依次...... 
        n=n-a[i];
        i++;
    }
 
    while(n>0) //余数依次减1,加在已分配好的因子上
    {
        for(j=0;j<i;j++)
        {
            a[i-j-1]++; //从最大的数开始加1
            n--;        //余数减1 
            if(n==0)    //若n不等于0,继续执行下一轮分配 
            {
			    break;
			}  
        }
    }
 
    j=0;
    while(j<i) //求最终的乘积
    {
        sum=sum*a[j];
        j++;
    }
    cout<<sum;
    return 0;
}

在这里插入图片描述

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

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

相关文章

【STL】bitset位图的介绍和使用

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

优思学院|精益管理涵盖哪些内容?

精益生产管理涵盖哪些内容&#xff1f;精益生产是一种以客户需求为引导、以消除浪费和持续改进为核心的生产管理模式&#xff0c;有效提升了公司的效率和利润&#xff0c;投入却极少。它包含哪些具体要素呢&#xff1f; 准时化生产&#xff08;JIT&#xff09; JIT&#xff0…

idea调教-全键盘操作

先转个vim&#xff0c;现在代码编辑可以使用全部键盘 接下来键盘使用目录 现在需要在项目文件中进行跳转&#xff0c;idea在左边目录等进行切换使用alt1等可以切换左右目录等&#xff0c;用方向建可以选中对应的文件&#xff0c;使用shiftenter可以在右边打开新的标签页,使用a…

日常--windows11右键切换回win10

文章目录 一&#xff0e;前言二&#xff0e;方法1.一键切换2.恢复回Win11右键菜单&#xff1a; 一&#xff0e;前言 从win10更新成win11后&#xff0c;很多地方不适应&#xff0c;这里演示如何将windows11右键切换回win10 二&#xff0e;方法 1.一键切换 winr打开运行 输入…

C++ 友元函数和友元类

前言 在本文中&#xff0c;您将学习在C 中创建友元函数和友元类&#xff0c;并在程序中有效地使用它们。OOP的重要概念之一是数据隐藏&#xff0c;即非成员函数无法访问对象的私有或受保护的数据。但是&#xff0c;有时这种限制可能迫使程序员编写冗长而复杂的代码。因此&#…

反向传播back propagation

深度学习概述 决定要怎么连接这些neuron的时候 就已经确定了function set 相比于之前做logistic regression&#xff0c;linear regression的时候&#xff0c;换一个方式来决定function set 比较大&#xff0c;包含了logistic regression&#xff0c;linear regression没法包含…

【C++入门 一 】学习C++背景、开启C++奇妙之旅

目录 1.什么是C2. C的发展史3. C的重要性3.1 语言的使用广泛度3.2 在工作领域1. 操作系统以及大型系统软件开发2. 服务器端开发3. 游戏开发4. 嵌入式和物联网领域5. 数字图像处理6. 人工智能7. 分布式应用 3.3 在校招领域3.3.1 岗位需求3.3.2 笔试题 4. 如何学习C4.1 别人怎么学…

工业电子中的深力科分享一款PWM控制器 KA3525A

关于PWM控制器&#xff1a; PWM控制器是一种用于控制电机或其他设备的电路&#xff0c;它通过改变脉冲宽度调制&#xff08;PWM&#xff09;信号的占空比来控制设备的输出。PWM控制器可以使用单片机或开发板等设备来实现&#xff0c;通过设定占空比&#xff0c;可以轻松地控制…

LeetCode —— dfs和bfs

797. 所有可能的路径 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09;。 graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节点…

【斗罗二】天梦哥告白冰帝,唐三再返场,雨浩通过冰帝考验,觉醒新武魂

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗罗大陆2绝世唐门国漫资讯。 斗罗大陆动画第二部绝世唐门第19集已经更新了&#xff0c;全都是霍雨浩与天梦哥在极北之地&#xff0c;吸引冰帝加入造神计划的过程。不仅有天梦哥的爱情宣言告白&#xff0c;唐三也再次限时…

设计模式_备忘录模式

备忘录模式 介绍 设计模式定义案例问题堆积在哪里解决办法备忘录模式行为型模式&#xff0c; 保存了数据某一个时间点的状态 在需要的时候进行回档单机游戏的角色 数据保存并且回档保存和回档加一个状态管理类 类图 代码 MomentData using UnityEngine;public class MomentD…

SLAM从入门到精通(从仿真到实践)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前花了40多篇文章&#xff0c;弄清了什么是slam&#xff0c;怎么学习slam&#xff0c;什么是ros&#xff0c;怎么利用ros来学好slam等等。不仅如…

云安全(1)--初识容器逃逸之特权容器逃逸

文章目录 前言privileged,特权容器逃逸环境配置实际利用实际环境利用计划任务/var/spool/cron/crontabs/ 适用于ubuntu debain/var/spool/cron 适用于centos ld.so.preloadssh 前言 在10.15号的上海中华武数杯的渗透赛里做到了一个k8s的题目&#xff0c;这应该是我第一次在比赛…

13.3测试用例进阶

一.测试对象划分 1.界面测试(参考软件规格说明书和UI视觉稿) a.什么是界面 1)WEB站(浏览器) 2)app 3)小程序 4)公众号 b.测试内容 1)界面内容显示的一致性,完整性,准确性,友好性.比如界面内容对屏幕大小的自适应,换行,内容是否全部清晰展示. 2)验证整个界面布局和排版…

【数据结构】线性表(七)堆栈:链式栈及其基本操作(初始化、判空、入栈、出栈、存取栈顶元素、清空栈);顺序栈与链式栈之比较

文章目录 一、堆栈1. 定义2. 基本操作 二、顺序栈三、链式栈0. 链表1. 头文件和常量2. 栈结构体3. 栈的初始化4. 判断栈是否为空5. 入栈6. 出栈7. 存取栈顶元素8. 清空栈9. 主函数10. 代码整合 四、 顺序栈与链式栈的比较 堆栈&#xff08;Stack&#xff09;和队列&#xff08;…

Linux MMC子系统 - 1.eMMC简介

By: Ailson Jack Date: 2023.10.21 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/160.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

JAVA基础-数据类型(2)

目录 1、基本数据类型2、引用数据类型3、类型默认值4、数据类型的转换4.1、自动类型转换4.2、强制类型转换4.3、隐含强制类型转换 1、基本数据类型 :::tips Java语言提供了八种基本类型。六种数字类型&#xff08;四个整数型&#xff0c;两个浮点型&#xff09;&#xff0c;一…

C++多重、多层、分层继承

在本文中&#xff0c;您将学习C 编程中的不同继承模型&#xff1a;带有示例的多继承&#xff0c;多层和分层继承。 继承是面向对象编程语言的核心功能之一。它允许软件开发人员从现有的类派生一个新的类。派生类继承基类&#xff08;现有类&#xff09;的功能。C 编程中有多种…

逗号表达式

#include<stdio.h> int cmp() {return(2,1); } int main() {int z cmp();printf("%d",z);return 0; } 逗号表达式括号里的优先级是自左向右&#xff0c;最后一个值为最终的结果。

YOLOv5改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…