1 月 27日算法练习-贪心

news2025/1/16 16:43:22

文章目录

  • 扫地机器人
  • 分糖果
  • 最小战斗力差距
  • 谈判
  • 纪念品分组

扫地机器人

在这里插入图片描述
思路:

  1. 最优机器人清理方法:机器人清理方法先扫左边,有时间再扫右边。
  2. 最短时间:通过枚举,从 1 开始,清理面积会越大直到全部面积的清理时间是最小时间。优化:二分枚举时间,由于随时间增大清理面积增大,单调可以用二分。
#include<iostream>
#include<stdbool.h>
using namespace std;
const int N = 1e5+10;
int a[N];
int n,k;

bool check(int mid){
    int pos=0;
    for(int i=1;i<=k;i++){
        int t=mid;
        t-=(a[i]-pos-1)*2;
        if(t<0)return false;
        pos = a[i]+t/2;
    }
    if(pos<n)return false;
    return true;
}
int main( ){
    cin>>n>>k;
    for(int i=1;i<=k;i++)cin>>a[k];
    sort(a+1,a+1+k);
    int l=1,r=2*n,ans=2*n;
    while(l<=r){
        int mid=l+r>>1;
        if(check(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }
    cout<<ans<<'\n';
    return 0;
}

分糖果

在这里插入图片描述
思路:贪心中的规律题。先理解题意+找出规律。先排序,能保证最大的最小,然后分成三种情况,第一种全部字符相等,就平分,多余的放到最后一个。第二种,如果第 x 个和第一个相等就直接输出 x 到最后。第三种如果不相等,把 x 后面放到第一个,直接输出 x。x 肯定比第一个字符串大,并且 x 最小。

找规律的贪心,考验思维,将字符串分类讨论,设计贪心策略。
先给字符串排序,然后我们可以分为三类讨论:
1)字符串全相等(假设全a),那就是尽量使得每个人分到的字符串的最大长度尽可能小就行。
2)s[x]==s[1],说明第x个是最小的字符带着后面所有的字符一起输出。
3)s[x]!=s[1],后面一坨字符可以直接丢到s[1]后面,分给第一个同学。

#include<iostream>
using namespace std;
const int N =1e6+10;
char s[N];
int main( ){
    int n,x;cin>>n>>x;
    for(int i=1;i<=n;i++)cin>>s[i];
    sort(s+1,s+1+n);
    if(s[1]==s[n]){
        for(int i=1;i<=n/x+(n%x?1:0);i++)cout<<s[i];
    }else{
        if(s[1]==s[x])for(int i=x;i<=n;i++)cout<<s[i];
        else cout<<s[x];
    }
    return 0;
}

最小战斗力差距

在这里插入图片描述
思路:贪心,所有方案中排序后划分分为 a,b 两个组会比不排序划分的战斗力更小。所以选择排序后将 a,b 划分,其中枚举所有结果选择最小的。
要将战斗力分为两部分,为了使得差距最小,我们可以将战斗力排序后,找一个位置进行划分,使得左边的都在a,右边的都在b,从而这个差距就是这个位置两边的战斗力差距,说明差距的取值仅有n-1种,枚举即可。
这个题启发我们,当混乱的数据不好处理,且排序不影响答案时,尝试先排序再分析。

#include<iostream>
using namespace std;
const int N = 1e5+10;
int a[N];
int main( ){
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    int ans=a[2]-a[1];
    for(int i=2;i<=n;i++)ans=min(ans,a[i]-a[i-1]);
    cout<<ans<<'\n';
    return 0;
}

谈判

在这里插入图片描述
思路:一共要进行 n-1 步,只要保证每次合并最小的两个部落就能保证总代价最小。
总操作数一定情况下的最小代价模型。我们知道这里一共需要进行的操作次数一定是n-1次,那么贪心地想,如果每次选择代价最小的两个部落合并,不仅可以使得当前代价最小,还可以使得后续合并的代价也尽可能小。
部落大小通过优先队列来维护。

#include<iostream>
#include<queue>
using namespace std;
using ll = long long;
priority_queue<ll,vector<ll>,greater<ll>> pq;
int main( ){
    int n;cin>>n;
    for(int i = 0;i<n;i++){
        ll x;cin>>x;
        pq.push(x);
    }
    ll ans=0;
    while(pq.size()>1){
        ll x=pq.top();pq.pop();
        ll y=pq.top();pq.pop();
        ans+=x+y;
        pq.push(x+y);
    }
    cout<<ans<<'\n';
    return 1;
}

纪念品分组

在这里插入图片描述
思路:要使分组尽可能少就尽可能进行两人分组,两人分组中一个多带一个小的会比两小+两多这种方案分组少,所以用一个多带一个小。因为两个多可能超出范围,然后就单独分组多分出组数。
最少数目的贪心模型。
为了使得组数最小,我们应该使得每一组内尽可能装两件礼物(最多只能装两件),尽量占满一组的容量。所以贪心策略是,每一个贵的礼物,带一个便宜的,因为带也是一组,不带也是一组,肯定选择带,且最贵的和最便宜的最容易占满一组。

#include<iostream>
using namespace std;
const int N = 1e5;
int a[N];
int main(){
    int w,n;cin>>w>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    int l=1,r=n,ans=0;
    while(l<=r){
        ans++;
        if(l==r){
            break;
        }
        if(a[l]+a[r]<=w){
            l++,r--;
        }else r--;
    }
    cout<<ans<<'\n';
    return 0;
}

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

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

相关文章

测试C#调用OpenCvSharp和IronOcr从摄像头中识别文字

学习了基于OpenCvSharp获取摄像头数据&#xff0c;同时学习了基于IronOcr的文字识别用法&#xff0c;将这两者结合即是从摄像头中识别文字。本文测试C#调用OpenCvSharp和IronOcr从摄像头中识别文字的基本用法、。   新版Winform项目&#xff0c;在Nuget包管理器中添加以下程序…

macOS系统鼠标变彩虹的解决办法(详细)

目录 第一步 打开活动监视器 第二步 找出【简体中文输入方式】这个进程 第三步 点击最上方的"X"按钮&#xff0c;选择"退出" 按钮 第一步 打开活动监视器 如果下方的任务栏没有显示&#xff0c;可以在左下角【启动台】-其他里打开 -- 第二步 找出【…

编曲学习:和声音程 调式体系 唱名法 调式调性

34届和声音程 调式体系 唱名法 调式调性https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65af994be4b064a8cb1c3a5f?course_idcourse_2XLKtQnQx9GrQHac7OPmHD9tqbv 34届独立音乐人编曲训练营https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_p…

Web 鼠标滑过有粒子掉落

最近在写接口&#xff0c;反正环境也有了&#xff0c;无聊写点代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>粒子效果</title><style>body {ma…

Selenium + Django + Echarts 实现亚马逊商品数据可视化爬虫项目

最近完成了1个爬虫项目&#xff0c;记录一下自己的心得。 项目功能简介 根据用户输入商品名称、类别名称&#xff0c;使用Selenium, BS4等技术每天定时抓取亚马逊商品数据&#xff0c;使用Pandas进行数据清洗后保存在MySql数据库中. 使用Django提供用户端功能&#xff0c;显…

架构篇20:高性能负载均衡-分类及架构

文章目录 负载均衡分类1. DNS 负载均衡2. 硬件负载均衡3. 软件负载均衡负载均衡典型架构小结单服务器无论如何优化,无论采用多好的硬件,总会有一个性能天花板,当单服务器的性能无法满足业务需求时,就需要设计高性能集群来提升系统整体的处理性能。 高性能集群的本质很简单…

【JavaScript】ECMA6Script es6

文章目录 一、 es6的介绍二、 es6的变量和模板字符串2.1 let 与 var2.2 const 与 var2.3 模板字符串 三、 es6的解构表达式四、 es6的箭头函数4.1 声明和特点4.2 实践和应用场景4.3 rest和spread 五、es6的对象创建和拷贝5.1 对象创建的语法糖5.2 对象的深拷贝和浅拷贝 六、es6…

【ArcGIS遇上Python】python实现批量XY坐标生成shp点数据文件

单个手动生成:【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层 文章目录 一、问题分析二、解决办法三、注意事项一、问题分析 现有多个excel、txt或者csv格式的坐标数据,需要根据其坐标批量一键生成shp点数据,如下X为经度,…

【Java】SpringMVC参数接收(一)

1、接收单个参数 &#xff08;1&#xff09;直接接收参数 RequestMapping("/hello") RestController public class HelloSpring {RequestMapping("/t2")public String t2(String name){return "name" name;} } 当没有传入参数时&#xff0c;返…

浪花 - 后端接口完善

一、队伍已加入用户数量 1. 封装的响应对象 UserTeamVO 新增字段 hasJoinNum 2. 查询队伍 id 列表 3. 分组过滤&#xff0c;将 team_id 相同的 userTeam 分到同一组 4. 获取每一组的 userTeam 数量&#xff0c;即一个 team_id 对应几个userTeam&#xff08;用户数量&#x…

【Android】MediaCodec学习

在开源Android屏幕投屏代码scrcpy中&#xff0c;使用了MediaCodec去获取和display关联的surface的内容&#xff0c;再通过写fd的方式&#xff08;socket等&#xff09;传给PC端&#xff0c; MediaCodec的处理看起来比较清楚&#xff0c;数据in和数据out 这里我们做另外一个尝试…

Blender教程(基础)-面的细分与删除、挤出选区-07

一、Blender之面的细分 新建一个立方体&#xff0c;在编辑模式下、选中一个面。 在选中的面上单击右键弹出细分选项&#xff0c;选择细分。 在选中细分后、会默认细分1次。修改细分次数在左下角 二、Blender之面的删除 选择中需要操作的面&#xff0c;在英文状态下按X键弹…

ELK日志解决方案

ELK日志解决方案 ELK套件日志系统应该是Elasticsearch使用最广泛的场景之一了&#xff0c;Elasticsearch支持海量数据的存储和查询&#xff0c;特别适合日志搜索场景。广泛使用的ELK套件(Elasticsearch、Logstash、Kibana)是日志系统最经典的案例&#xff0c;使用Logstash和Be…

机房环境动力监控系统:S275远程控制网关助力高效管理

现场问题 1、机房安全隐患 机房存在意外断电、温湿度过高过低、漏水断路等隐患&#xff0c;传统监测手段难以提前发现和预警。 2、机房远程运维困难 因环境改变、非授权活动、设备状态变化等引起的事故&#xff0c;难以满足机房远程运维的可靠管控要求。 3、机房改造成本高…

POJ No.1852 Ants

思路分析 “转向”问题 假设蚂蚁A与蚂蚁B相遇后转向&#xff0c;可以视作A&#xff0c;B交换位置&#xff0c;从而消除转向。 距离问题 最长距离&#xff1a;比较每只蚂蚁距两端的最大距离&#xff0c;取两端中最大值&#xff0c;取一组中最长距离的最大值。 最短距离&…

八种Flink任务告警方式

目录 一、Flink应用分析 1.1 Flink任务生命周期 1.2 Flink应用告警视角分析 二、监控告警方案说明 2.1 监控消息队中间件消费者偏移量 2.2 通过调度系统监控Flink任务运行状态 2.3 引入开源服务的SDK工具实现 2.4 调用FlinkRestApi实现任务监控告警 2.5 定时去查询目标…

跟着小德学C++之TOTP

嗨&#xff0c;大家好&#xff0c;我是出生在达纳苏斯的一名德鲁伊&#xff0c;我是要立志成为海贼王&#xff0c;啊不&#xff0c;是立志成为科学家的德鲁伊。最近&#xff0c;我发现我们所处的世界是一个虚拟的世界&#xff0c;并由此开始&#xff0c;我展开了对我们这个世界…

RandomQuestionPicker简单的随机抽题系统

一个简单的随机抽题系统&#xff0c;题库以文件的方式读入程序&#xff0c;功能是随机抽题并记录某题抽取次数。刚好有需要&#xff0c;给自己写了个&#xff0c;顺便开源。 没做UI界面。需要的同学自取即可。 使用时将questions.txt文件和src并列放到Project目录下&#xff…

Linux中并发程序设计(进程的创建和回收、exec函数使用、守护进程创建和使用、GDB的父、子进程代码的调试、线程的创建和参数传递)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注&#xff1a;进程是存在RAM中&#xff0c;程序是存放在ROM(flash)中的进程内容 BSS段&#xff…

RK3588平台开发系列讲解(视频篇)RKMedia框架

文章目录 一、 RKMedia框架介绍二、 RKMedia框架API三、 视频处理流程四、venc 测试案例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKMedia是RK提供的一种多媒体处理方案,可实现音视频捕获、音视频输出、音视频编解码等功能。 一、 RKMedia框架介绍 功能: VI(输…