从一道题到贪心入门

news2025/8/6 10:08:12

今天,我们将从一道题引入贪心算法的认识.

题目

题目描述

又是一年秋季时,陶陶家的苹果树结了 n 个果子。陶陶又跑去摘苹果,这次他有一个 a 公分的椅子。当他手够不着时,他会站到椅子上再试试。

这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 s 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0之前最多能摘到多少个苹果。

现在已知 n个苹果到达地上的高度 x_{i},椅子的高度 a,陶陶手伸直的最大长度 b,陶陶所剩的力气 s,陶陶摘一个苹果需要的力气 y_{i},求陶陶最多能摘到多少个苹果。

输入格式

第 1 行:两个数 苹果数 n,力气 s。

第 2 行:两个数 椅子的高度 a,陶陶手伸直的最大长度 b。

第 3 行~第 3+n−1 行:每行两个数 苹果高度 x_{i},摘这个苹果需要的力气y_{i}。 

输出格式

只有一个整数,表示陶陶最多能摘到的苹果数。

输入输出样例

输入:

8 15
20 130
120 3
150 2
110 7
180 1
50 8
200 0
140 3
120 2

输出:

4

要想知道详细题目,详见陶陶摘苹果(升级版) - 洛谷 

梳理题目:

我们现在先重新梳理一下题目中数据:

的n表示着树上苹果的总和数,s表示陶陶搬凳子时候还剩下的力气.

a表示凳子的高度,b表示陶陶伸出手臂的最大长度.

接下来的x_{i}表示每一个苹果的高度,y_{i}表示陶陶摘每一个苹果所花的力气.

代码思路:

首先由于要输入每一个苹果的高度和陶陶摘这个苹果所要消耗的力气,我打算用一个结构体来储存数据:

struct apple{
    int a_long,s_long;
}a[MAX],b[MAX];

 在这个结构体中,a_long是每一个苹果距离地面的高度,s_long表示摘每一个苹果要花的力气.(怪鄙人英语不好).接着,a数组用来输入,b数组用来储存当陶陶伸出手臂的最大值时能摘到苹果.

接下来,我定义了一下的变量

int n,s,chair,arm,sum=0,j=1,cnt=0, a_long, s_long;

 简单说明一下:

n,s,chair,arm,这四个变量前面的说了的,就不必详细的赘述了.

sum用来统计陶陶消耗的力量值,j用来计算有多少个苹果刚好能被陶陶摘到.

cnt用来计数最终在力量消耗完之前所能摘到的苹果个数.

a_long和s_long在冒泡排序里边做为一个交换的媒介.

接下来的输入就不用多说了.

cin>>n>>s>>chair>>arm;
for(int i=1;i<=n;i++){
   cin>>a[i].a_long>>a[i].s_long;
}

接下来我们要进行关键的一步––筛选.

我们要把陶陶能够摘到的苹果储存在b数组里.前提是这个苹果的高度要小于等于板凳的高度加上陶陶伸长手臂能达到的最大值

接着就有了一下的判断

if(a[i].a_long<=chair+arm){
     b[j].a_long=a[i].a_long;
     b[j].s_long=a[i].s_long;
}

别急,还没完,外面还有一层循环:

for(int i=1;i<=n;i++){
     if(a[i].a_long<=chair+arm){
          b[j].a_long=a[i].a_long;
          b[j].s_long=a[i].s_long;
          j++;
     }
}

接下来的一步,十分重要.

我们要把已经筛选出来的数据,重新排一下序.用什么顺序排序呢?当然是以每个苹果消耗力量的值以升序排序,更利于我们下一步的计算.

在这里,我用的是冒泡排序(sort当时突然一时想不起来了)

下面是冒泡排序里面的交换程序,要想知道冒泡排序的详细解法,详见排序算法(冒泡,桶排序,选择,sort)_cyy_yyds(蒟蒻练习生)的博客-CSDN博客

a_long=b[k].a_long;
s_long=b[k].s_long;
b[k].a_long=b[k+1].a_long;
b[k].s_long=b[k+1].s_long;
b[k+1].a_long=a_long;
b[k+1].s_long=s_long;

 当然,这里面也可以用swap函数

 接下来亮出整个冒泡的代码

​
for(int i=1;i<n;i++){
     for(int k=1;k<j-i+1;k++){
          if(b[k].s_long>b[k+1].s_long){
                //swap(b[k].s_long,b[k+1].s_long);
                //swap(b[k].a_long,b[k+1].a_long);
                a_long=b[k].a_long;
                s_long=b[k].s_long;
                b[k].a_long=b[k+1].a_long;
                b[k].s_long=b[k+1].s_long;
                b[k+1].a_long=a_long;
                b[k+1].s_long=s_long;
          }
      }
}

​

重头戏来了,来到了本讲最重要的地方––贪心算法.

要学会写代码,先要知道贪心是什么:

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解(源自于百度百科)

明白了贪心的含义,接下来我们来梳理一下本题如何使用贪心算法

首先,你要满足sum(目前消耗掉的力量)<s(原有的力量)时,才能进入循环,就会避免当力气达到了上线但陶陶继续摘苹果的奇葩.

进入循环后,cnt++,表示摘了一个苹果,然后用sum加上摘这个苹果所消耗的力量值.随后下标+1,可以得到以下代码 

while(sum<s){
   cnt++;
   sum+=b[j].s_long;
   j++;
}

可是接下来我们运行后会发现,加入树上的苹果已经摘完了,可是所消耗的力量值尚未达到上限时,它还会继续循环,并不会退出循环

所以我们应该加上一个条件

while((sum<s)&&(cnt<j1)){
   cnt++;
   sum+=b[j].s_long;
   j++;
}

接下来输出

if(sum>s) cout<<cnt-1<<endl;//减去最后一次多统计的一次
else cout<<cnt<<endl;

本道题目讲解完毕,奉上最终代码(注:有些注释是我用来测试的,这道题我测试了好就才AC)

#include<iostream>
#define MAX 0xffff//65535
using namespace std;
struct node{
    int a_long,s_long;
}a[MAX],b[MAX];
//结构体,b数组储存的是苹果的高度正好在淘淘的手臂长和凳子高之内的数
int n,s,chair,arm,sum=0,j=1,cnt=0, a_long, s_long;
//chair是凳子的高度,arm是手臂的长度
//sum用来统计力气是否用完,cnt用来计数能摘到多少果子
int main(){
    cin>>n>>s>>chair>>arm;
    for(int i=1;i<=n;i++)
        cin>>a[i].a_long>>a[i].s_long;
    //输入结构体a_long表示高度,s_long表示力气
    for(int i=1;i<=n;i++){
        if(a[i].a_long<=chair+arm){
            b[j].a_long=a[i].a_long;
            b[j].s_long=a[i].s_long;
            j++;
        }
    }//用来统计恰好能摸到的果子,储存在b数组里
    
    //cout<<"b data:\n";
    //for(int i=1;i<j;i++){
    //    cout<<b[i].a_long<<" "<<b[i].s_long<<"    ";
    //}
    //cout<<endl;
    j--;
    int j1=j;
    for(int i=1;i<n;i++){
        for(int k=1;k<j-i+1;k++){
            if(b[k].s_long>b[k+1].s_long){
                //swap(b[k].s_long,b[k+1].s_long);
                //swap(b[k].a_long,b[k+1].a_long);
                a_long=b[k].a_long;
                s_long=b[k].s_long;
                b[k].a_long=b[k+1].a_long;
                b[k].s_long=b[k+1].s_long;
                b[k+1].a_long=a_long;
                b[k+1].s_long=s_long;
            }
        }
    }//冒泡排序,排的是每一个果子所需要的力气,升序
    //cout<<"after swap:\n";
    //for(int i=1;i<=j;i++){
        //cout<<b[i].a_long<<" "<<b[i].s_long<<"    ";
    //}
    //cout<<"\n";
    j=1;
    //<<"power:"<<s<<"\n";
    //cout<<"sum:"<<sum<<"\n";
    //cout<<"cnt:"<<cnt<<"\n";
    while((sum<s)&&(cnt<j1)){
        cnt++;
        sum+=b[j].s_long;
        //cout<<"sum:"<<sum<<" ";
        //cout<<"cnt:"<<cnt<<" ";
        j++;
    }//重头戏,贪心
    if(sum>s) cout<<cnt-1<<endl;//减去最后一次多统计的一次
    else cout<<cnt<<endl;
    return 0;
}

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

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

相关文章

搭建ESP8266开发环境

获取工具 安信可一体化开发环境 Source insight (本菜鸟不太喜欢用Eclipse) 安装 安装ESP8266开发环境(Windows) 1)双击运行解压到文件 2)安装方式一:eclipse 双击运行ConfigTool.exe点击 Default 可以检测当前所在路径&#

图神经网络关系抽取论文阅读笔记(三)

1 用于关系提取的注意引导图卷积网络&#xff08;Attention Guided Graph Convolutional Networks for Relation Extraction&#xff0c;2020&#xff09; 论文&#xff1a;Attention Guided Graph Convolutional Networks for Relation Extraction&#xff0c;2020 1.1 引言 依…

笔试强训第一天

选择题&#xff1a; 题目1&#xff1a; 我们对这道题目进行分析&#xff1a;第一个打印的是computer没有什么问题&#xff0c;但是第二个%5.3s我们需要进行分析&#xff1a; %m.ns m表示输出字符串的宽度&#xff0c;这里输出字符串的宽度为5 n表示左起截取目标字符串的n个…

m基于OFDM系统,对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 OFDM系统下对比SC算法&#xff0c;Minn算法&#xff0c;PARK算法同步性能matlab仿真分析。OFDM系统中的定时估计和频率频率算法——时频联合估计的SC算法&#xff0c;由Schmidl和Cox提出…

Python入门自学进阶-Web框架——27、DjangoAdmin项目应用-数据记录操作2

四、对数据记录删除 1、首先是配置整个流程框架&#xff0c;使整个流程运转顺利&#xff1a; 路由项添加&#xff1a;path(<str:app_name>/<str:table_name>/<int:id_num>/delete/,views.rec_obj_delete,namerec_delete), 主要是匹配记录的id和delete字符…

【LeetCode每日一题:809.情感丰富的文字~~~双指针+计数器】

题目描述 有时候人们会用重复写一些字母来表示额外的感受&#xff0c;比如 “hello” -> “heeellooo”, “hi” -> “hiii”。我们将相邻字母都相同的一串字符定义为相同字母组&#xff0c;例如&#xff1a;“h”, “eee”, “ll”, “ooo”。 对于一个给定的字符串 S…

MyBatis核心对象简介说明

转自: MyBatis核心对象简介说明 MyBatis 有三个基本要素&#xff1a; 核心接口和类MyBatis核心配置文件&#xff08;mybatis-config.xml&#xff09;SQL映射文件&#xff08;mapper.xml&#xff09;下面首先介绍 MyBatis 的核心接口和类&#xff0c;如下图 每个 MyBatis 应…

华为云会议网络研讨会,按次订购更方便!

如今&#xff0c;云会议已经成为日常办公协作的常态&#xff0c;但在线发布会、大型培训会、大型招聘会等大型会议&#xff0c;常规云会议由于会议容量有限、人多会控难、角色单一等技术限制&#xff0c;已经无法满足大型会议的需求&#xff0c;此时&#xff0c;网络研讨会便能…

【电商】电商后台系统整体介绍

电商后台系统支撑了电商企业亿万级的交易量&#xff0c;其重要性不言而喻。本文章将从电商后台系统的的各个模块来分析&#xff0c;让大家的后台真正”硬“起来。 当前关于产品经理的文章主要偏向方法论、业界动向、产品分析、用户体验、交互等&#xff0c;关于后台系统的文章比…

m在simulink进行DS-CDMA建模,然后通过MATLAB调用simulink模型进行误码率仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 研究信道编码在噪声和衰落信道条件下传输和保护数据或图像类型源的性能。在工作于AWGN和瑞利衰落信道&#xff08;可根据需要选择信道类型&#xff09;的Simulink中创建二进制PSK&#x…

Metabase学习教程:视图-5

用地图可视化数据 如何使用标注地图、区域地图和网格地图来可视化Metabase中的数据。 本文介绍如何在Metabase中使用地图来可视化数据。本文中使用的美国地图是使用示例数据库每次安装Metabase时都会用到。 地图类型 Metabase具有三种地图类型&#xff1a; 标注地图标记特…

【Spring(五)】引入篇:一文带你弄懂AOP的底层原理(动态代理)

有关Spring的所有文章都收录于我的专栏&#xff1a;&#x1f449;Spring&#x1f448; 目录 一、前言 二、使用AOP需要的依赖 三、引入 四、AOP的底层原理之动态代理 五、总结 相关文章 【Spring&#xff08;一&#xff09;】如何获取对象&#xff08;Bean&#xff09;【Sprin…

[附源码]SSM计算机毕业设计民宿客栈管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于QT封装海康SDK(MvCameraControl),访问控制海康相机

1、封装类HkCameraApi,此类可以访问控制海康的网络相机、USB相机,可以同时采集多台相机的视频、控制设置的各种属性设置。 2、采集效果如下: 3.、该类已经上传,下载地址:基于C++封装HkCameraApi类,用于访问控制海康相机-C++文档类资源-CSDN下载 4、HkCameraApi类的头文…

【附源码】计算机毕业设计JAVA疫情下的居民管理系统

【附源码】计算机毕业设计JAVA疫情下的居民管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA…

算法图解学习4 递归

random recording 随心记录 What seems to us as bitter trials are often blessings in disguise. 看起来对我们痛苦的试炼&#xff0c;常常是伪装起来的好运。 递归 背景导入 在一个盒中盒找钥匙 第一种实现方法&#xff0c;如下图 第二种方法&#xff0c;如图 两种方法伪代…

6.jQuery中的Ajax上传文件

目录 1 上传文件 2 loading效果 1 上传文件 后端接到数据后保存在upload_file文件夹下 前端依然使用FormData处理文件 contentType:false的意思是 使用FormData默认的Content-Type值 processData:false的意思是 不对FormData中的数据进行url编码&#xff0c;而是将Form…

与专业安全厂商相比,戴尔做安全的优势是什么?

上文介绍了戴尔大谈零信任架构的原因&#xff0c;也提到了现代安全的三大要素&#xff0c;分别为&#xff1a;信任的基础、简化的零信任采纳和网络恢复计划。事实上&#xff0c;戴尔作为全球大型IT基础设施提供商&#xff0c;能提供多种网络安全能力来构建现代安全&#xff0c;…

当你碰到了MySQL中的死锁,你了解这些机制吗?

MySQL死锁怎么来的&#xff1f; 当两个及以上的事务&#xff0c;双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源&#xff0c;就会出现“死锁”。 总结一下生产死锁的4个条件&#xff1a; 两个或者两个以上事务 每个事务都已经持有锁并且申请新的锁…

[附源码]java毕业设计游戏战队考核系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…