贪心算法(常见贪心模型)

news2025/2/5 19:49:55

常见贪心模型

 简单排序模型

最小化战斗力差距

题目分析:

 

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

int main()
{
  // 请在此输入您的代码
  cin >> n;
  for (int i = 1;i <= n;i++) cin >> a[i];
  sort(a+1,a+1+n);
  
  int disparity = 1e9-1;
  for (int i = 1;i < n;i++) disparity = min(disparity,a[i+1] - a[i]);

  cout << disparity << '\n';

  return 0;
}

 货仓选址 

可以发现,仓库建在中间,可以使得货仓到每家商店的距离之和最小

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;

int n;
int a[N];

int main()
{
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i];
    
    sort(a+1,a+1+n);
    
    int store = a[n/2 + 1];
    
    int res = 0;
    for (int i = 1;i <= n;i++) 
    {
        if (i == n/2 + 1) continue;
        
        res += abs(store - a[i]);
    }
    
    cout << res << '\n';
    
    return 0;
}

总操作一定的情况下的最小代价模型

谈判

如果每次选择代价最小的两个部落合并,不仅可以使得当前代价最小,还可以使得后续合并的代价也尽可能小

局部最优 ==》全局最优

 用数组模拟(O(n^2 log n))

#include <bits/stdc++.h>
using namespace std;

const int N = 1010;

int n;
int a[N];

int main()
{
  // 先排序 找到两个人数最少的部落

  cin >> n;

  for (int i = 1;i <= n;i++) cin >> a[i];

  sort(a+1,a+1+n);
  
  int sum = 0;
  for (int i = 2;i <= n;i++) 
  {
    a[i] = a[i] + a[i-1];
    sum += a[i];
    sort(a+i,a+1+n);
  }
  
  cout << sum << '\n';
  return 0;
}

 用优先级队列实现

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

priority_queue<ll,vector<ll>,greater<ll>> pq;

int main()
{
  //用优先队列实现 每次取其中两个代价最小的部落进行合并,总花费最小
  int n;cin >> n;
  for (int i = 1;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 0;
}
 糖果传递

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 1000010;

int n;
int a[N];
ll c[N];

int main()
{
    cin >> n;
    ll sum = 0;
    for (int i = 1;i <= n;i++) cin >> a[i],sum += a[i];
    
    int avg = sum / n;
    
    for (int i = n;i > 0;i--) c[i] = c[i+1] + avg - a[i];
    
    c[1] = 0;
    
    sort(c+1,c+1+n);
    
    ll res = 0;
    for (int i = 1;i <= n;i++) res += abs(c[i] - c[(n+1)/2]);
    
    cout << res << '\n';
    
    return 0;
}

最少数量的贪心模型

纪念品分组

 

 

 

为了让组数最少,我们要尽可能将两个纪念品打包成一组

怎样的两个纪念品最有可能打包成一组呢,无疑是一个大和一个小的

所以我们先去找最大和最小的,如果不能打包,则去找次小的,直到能打包成一组

不能打包的大的纪念品则单独一组

#include <bits/stdc++.h>
using namespace std;

const int N = 30010;

int w,n;
int a[N];

int main()
{
  // 请在此输入您的代码
  cin >> w >> n;

  int cnt = 0;
  for (int i = 1;i <= n;i++) cin >> a[i];

  sort(a+1,a+1+n);

  for (int i = 1,j = n;;)
  {

    if (i > j) break;

    if (a[i] + a[j] <= w)
    {
      cnt++;
      i++,j--;
    }else {
      j--;
      cnt++;
    }

  }

  cout << cnt << '\n';
  return 0;
}

找规律的贪心模型

分糖果

我们要去使得所有糖果组成的字符串中字典序最大的字符串尽可能小

字符串字典集大小先看首字母大小,其次看后面的字母大小

a < b < c ...

a < aabs...

先给字符串排序,然后分为三类讨论

1️⃣字符串全相等(假设全a),那就尽量使得每个人分到的字符串的最大长度尽可能小,即平分字符串

2️⃣s[x] == s[1] 说明第x个是最小的字符,让它带着后面所有的字符一起输出即可

3️⃣ s[x] != s[1] ,后面一坨字符直接丢到s[1]后面,分给 第一个同学即可

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int n,x;
char s[N];

int main()
{
  // 请在此输入您的代码
  cin >> n >> x;
  cin >> s+1;
  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;
}
股票买卖II

容易发现规律,如果后一天的股票比当天高,那么就今天买入后一天卖出

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

int main() {
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i];
    
    int res = 0;
    for (int i = 1;i <= n;i++)
    {
        if (a[i] < a[i+1]) res += a[i+1] - a[i];
    }
    
    cout << res << '\n';
    
    return 0;
}
乘积最大

 

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 1e5 + 10,mod = 1000000009;

int n,k;
int a[N];

int main()
{
    cin >> n >> k;
    for (int i = 1;i <= n;i++) cin >> a[i];
    
    sort(a+1,a+1+n);
    
    int res = 1;
    int l = 1,r = n;
    int sign = 1;
    
    if (k % 2) 
    {
        res = a[r--];
        k--;
        if (res < 0) sign = -1;
    }
    
    while (k)
    {
        ll x = (ll)a[l] * a[l+1],y = (ll)a[r] * a[r-1];
        
        if (x * sign > y * sign)
        {
            res = x % mod * res % mod;
            l += 2;
        }else {
            res = y % mod * res % mod;
            r -= 2;
        }
        
        k -= 2;
    }
    
    cout << res << endl;
    
    return 0;
}

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

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

相关文章

供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇

概述 我们在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述 中描述了什么是供应链中台&#xff0c;供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解&#xff0c;我会逐一针对中台…

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统&#xff0c;其核心设计理念是将一切资源抽象为文件&#xff0c;即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…

transform、animation、transition?

transform、transition 和 animation 都是 CSS 属性&#xff0c;用于创建视觉效果&#xff0c;但它们的工作方式和用途不同&#xff1a; 1. transform (变换元素): 作用: transform 用于改变元素的旋转、缩放、移动、倾斜等属性&#xff0c;但不改变元素的初始状态和最终状态…

大数据技术-Hadoop(三)Mapreduce的介绍与使用

目录 一、概念和定义 二、WordCount案例 1、WordCountMapper 2、WordCountReducer 3、WordCountDriver 三、序列化 1、为什么序列化 2、为什么不用Java的序列化 3、Hadoop序列化特点&#xff1a; 4、自定义bean对象实现序列化接口&#xff08;Writable&#xff09; 4…

Echarts+vue电商平台数据可视化——webSocket改造项目

websocket的基本使用&#xff0c;用于测试前端能否正常获取到后台数据 后台代码编写&#xff1a; const path require("path"); const fileUtils require("../utils/file_utils"); const WebSocket require("ws"); // 创建WebSocket服务端的…

神经网络-Inception

Inception网络是由Google开发的一种深度卷积神经网络架构&#xff0c;旨在解决计算机视觉领域中的图像分类和物体识别任务。 Inception网络最初在2014年被提出&#xff0c;并在ImageNet图像分类挑战赛上取得了很好的结果。其设计灵感来自于模块化的思想&#xff0c;将不同尺度…

js给dom分页

减少js操作dom js引擎与渲染引擎相互独立, js操作dom过程开销大操作到了dom层面会触发渲染树的变化,触发回流与重绘开销大 让js给dom分压 js处理完操作后,最后给dom 缓存变量 let container document.getElementById(container) let content for(let count0;count<…

深度学习——神经网络中前向传播、反向传播与梯度计算原理

一、前向传播 1.1 概念 神经网络的前向传播&#xff08;Forward Propagation&#xff09;就像是一个数据处理的流水线。从输入层开始&#xff0c;按照网络的层次结构&#xff0c;每一层的神经元接收上一层神经元的输出作为自己的输入&#xff0c;经过线性变换&#xff08;加权…

秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! 下篇更新&#xff1a; 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。 默认的类型别名 MyBatis的增删改查 添加 <!--int insertUs…

瑞芯微全新芯片平台RK3506优势详解,高集成低功耗,为工业而生 触觉智能测评

RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台&#xff0c;三核Cortex-A7单核Cortex-M0多核异构设计&#xff0c;CPU频率达1.5Ghz, M0 MCU为200Mhz。 而RK3506芯片平台下的工业级芯片型号RK3506J&#xff0c;具备-40-85℃的工业宽温性能、发热量小&#…

AIOps平台的功能对比:如何选择适合的解决方案?

定义与概念 AIOps&#xff0c;即人工智能运维&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff0c;是将人工智能技术应用于 IT 运维领域&#xff0c;以实现自动化、智能化的运维管理。它通过整合大数据、机器学习等先进技术&#xff0c;对海量运维数…

Python + 深度学习从 0 到 1(03 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 神经网络的数据表示 – 张量 你可能对矩阵很熟悉&a…

Lumos学习王佩丰Excel第二十三讲:饼图美化与PPT图表

一、双坐标柱形图的补充知识 1、主次坐标设置 2、主次坐标柱形避让&#xff08;通过增加两个系列&#xff0c;挤压使得两个柱形挨在一起&#xff09; 增加两个系列 将一个系列设置成主坐标轴&#xff0c;另一个设成次坐标轴 调整系列位置 二、饼图美化 1、饼图美化常见设置 …

基于Vue+SSM+SpringCloudAlibaba书籍管理系统

功能要求 一、登录功能&#xff08;http://localhost:8080/#/login&#xff09; 输入账号和密码(admin/admin)进行登录&#xff1a; 如果密码错误&#xff0c;给出提示信息 如果密码正确&#xff0c;跳转到主页 账号或密码错误&#xff1a; 账号密码正确&#xff1a;跳转到…

【优先算法】滑动窗口 --(结合例题讲解解题思路)(C++)

目录 ​编辑 1.什么是滑动窗口&#xff1f; 2. 滑动窗口例题 2.1 例题1&#xff1a;长度最小的子数组 2.1.1 解题思路 2.1.2 方法一&#xff1a;暴力枚举出所有的子数组的和 2.1.3 方法二&#xff1a;使用 “同向双指针” 也就是滑动窗口来进行优化 2.2 例题2&#xff1a;无重…

VS Code 从命令行启动

在 VS Code 中&#xff0c;code 命令允许你在命令行中快速打开文件、文件夹或新窗口。 安装 原本地址&#xff1a;https://code.visualstudio.com/docs/setup/mac 使用 使用 code 命令 打开文件&#xff1a;你可以通过在命令行输入 code 文件名 来直接打开一个文件。 打开文…

微服务-配置管理

文章目录 1.什么是配置管理2.配置共享添加共享配置拉取共享配置 3.配置热更新添加配置到Nacos配置热更新 4.动态路由监听Nacos配置变更 1.什么是配置管理 到目前为止我们已经解决了微服务相关的几个问题&#xff1a; 微服务远程调用微服务注册、发现微服务请求路由、负载均衡…

ArrayList 和LinkedList的区别比较

前言 ‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析&#xff0c;他们一个是Array&#xff08;动态数组&#xff09;的数据结构&#xff0c;一个是Linked&#xff08;链表&#xff09;的数据结构&#x…

MySQL--》如何在SQL中巧妙运用函数与约束,优化数据处理与验证?

目录 函数使用 字符串函数 数值函数 日期函数 流程函数 约束 外键约束 约束规则 函数使用 函数是指一段可以直接被另一段程序调用的程序或代码&#xff0c;在mysql当中有许多常见的内置函数&#xff0c;接下来开始对这些内置函数及其作用进行简单的讲解和使用&#xf…

一文大白话讲清楚CSS盒子模型和块级格式化上下文(BFC)

一文大白话讲清楚CSS盒子模型和块级格式化上下文&#xff08;BFC&#xff09; 1.啥是个CSS盒子 鞋盒你家总有吧&#xff0c;方方正正&#xff0c;有长度有高度。css盒子跟这个八九不离十当我们编写html页面时&#xff0c;写了很多的元素&#xff0c;比如"div",&quo…