第13章贪心算法

devtools/2025/3/14 22:25:06/

算法>贪心算法

局部最优求得总体最优

适用于桌上有6张纸币,面额为100 100 50 50 50 10,问怎么能拿走3张纸币,总面额最大?—拿单位价值最高的

  1. 只关注局部最优----关注拿一张的最大值
  2. 拆解-----拿三次最大的纸币

不适用于桌面三件物品,每个物品都有重量和价值,

w v

6 9

5 7

3 3

承重为8,求不超过背包承重情况下最大价值

  1. 只能选一件,能不能得到最大值----选 6 9
  2. 还剩下二,能选第二件吗?不能选

所以不适用,因为不能局部最优求得总体最优

算法>贪心算法的设计就是一次一次用偏序关系证明贪心策略

偏序关系

在数学中,偏序集合是有序理论中,指配备了部分排序关系的集合(集合没有顺序,但加了一个用于排序的关系),将排序,顺序或排列这个元素的直觉概念抽象化。

使用偏序关系的传递性:xRy,yRz–>xRz,局部最优使得全局最优

例题1-国王游戏

排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

输出一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

C[i]=A[j]/B[i] :累乘从0到i-1

微扰:调整i和i+1位置的大臣,观察序列前后的变化:

微调的两个元素A[i]和A[i+1]只会改变他们两本身:所以微调后的C[i]'和C[i+1]'同时小于C[i+!]

A[i]xB[i] >= A[i+1]xB[i+1] :越小越往前,越大越往后

#include <iostream>
#include <algorithm>using namespace std;
#define MAX_N 1000
int a[MAX_N+5],b[MAX_N+5],ind[MAX_N+5]; //使用ind不对原数组排序,对下标数组排序
void acm_1_6_paixu_GuowangYouxi_test(){
//    A[i]xB[i] >= A[i+1]xB[i+1] :越小越往前,越大越往后int n;cin >> n;for(int i=0;i<=n;i++){cin >>a[i]>>b[i]; //左右手ind[i]=i;}sort(ind+1,ind+n+1,[&](int i,int j)->bool{return a[i]*b[i]<a[j]*b[j];});//统计大臣获得的最多金币数量int p=a[0],ans=0;for (int i=1;i<=n;i++){if(p/b[ind[i]]) //ind[i]表示排完序之后大臣的编号ans=p/b[ind[i]];p*=a[ind[i]];}cout << ans<<endl;}
int main(){acm_1_6_paixu_GuowangYouxi_test();return  0;
}
def acm_1_6_paixu_GuowangYouxi_test():n=int(input())a=list(range(n+1))b=list(range(n+1))ind=list(range(n+1))for i in range(n+1):a[i],b[i]=list(map(int,input().split()))ind[i]=iind[1:]=sorted(ind[1:],key=lambda i:a[i]*b[i]) #按照a[i]*b[i]从小到大排序ans=0p=a[0]for i in range(1,n+1):if(p//b[ind[i]]>ans):ans=p//b[ind[i]]p*=a[ind[i]]  #左边所有大臣左手累乘print(int(ans))
acm_1_6_paixu_GuowangYouxi_test()

最大整数

局部最优:a+b > b+a

arr.sort(key=cmp_to_key(cmp2))

from functools import cmp_to_key
def cmp2(a,b):if a + b > b + a: #大于return -1elif a + b < b + a: #小于return 1else:return 0 #相等
def test():n=int(input())arr = input().split()arr.sort(key=cmp_to_key(cmp2))print("".join(arr))
test()
#include <string.h>
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;
bool cmp(const string &a,const string &b){return a+b > b+a;
}
int main(){vector<string> arr;string s;int n;cin >> n;for (int i=0;i<n;i++){cin >> s;arr.push_back(s);}sort(arr.begin(),arr.end(),cmp);for(int i=0;i<n;i++){cout <<arr[i];}cout <<endl;}

删除

每次删除一位,保证删除一位后得到的结果位删除一位最小值

#include <iostream>
using namespace std;
#define MAX_N 500int main(){char s[MAX_N+5];int k;cin >> s >>k;for(int i=0;i<k;i++){ //进行k次删除,每次删除一位int j=0;//留下n-1位的最小值while(s[j+1] !='\0' && s[j] <= s[j+1]){++j;}//12343 //得到第一个逆序位高位4while(s[j]) s[j]=s[j+1],j++; //后面的向前移动//完成一轮删除}for(int i=0,flag=1;s[i];i++){if(s[i]=='0' && flag){//首位0不输出//flag表示有没有输出过数字continue;}cout << s[i];flag=0;}cout <<endl;return  0;
}
#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 Cry, Inc. All Rights Reserved 
#
# @Time    : 2024/4/10 11:47
# @Author  : Cry
# @File    : 删数、.py
# @IDE     : PyCharms=input()
n=int(input())
for i in range(n):for j in range(len(s)+1):if j+1==len(s):s=s[:j]+s[j+1:]breakif s[j]>s[j+1]:s=s[:j]+s[j+1:]break
print(int(s))

HZOJ 503独木舟

每次找最重和最轻的坐在一起

能坐在一起就一起走

不能坐在一起,就只让重的坐一条船

//
// Created by cry on 2024/4/10.
//
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void acm_1_13_tanxin_DumuZHou_test(){int w,n;cin >>w >> n;vector<int> arr(n);for(int i=0;i<n;i++){cin >> arr[i];}sort(arr.begin(),arr.end());int i=0,j=n-1,cnt=0; // i为最轻的 j为最重的while(i<j){//最轻的和最重的能不能坐一个船if(arr[i]+arr[j]<=w){i++,j--;}elsej--;cnt+=1;}if(i==j) cnt+=1; //还剩一个人cout << cnt<<endl;
}
#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 Cry, Inc. All Rights Reserved 
#
# @Time    : 2024/4/10 12:22
# @Author  : Cry
# @File    : 独木舟.py
# @IDE     : PyCharmw=int(input())
n=int(input())
arr=list(range(n))
for i in range(n):arr[i]=int(input())
arr=sorted(arr)
i=0
j=n-1
cnt=0
while(i<j):if(arr[i]+arr[j]<=w):i+=1j-=1else:j-=1cnt+=1
if(i==j):cnt+=1
print(cnt)

http://www.ppmy.cn/devtools/167128.html

相关文章

RabbitMQ五种消息模型

RabbitMQ 是一款基于 AMQP 协议的高性能消息中间件&#xff0c;广泛应用于分布式系统中&#xff0c;用于实现服务之间的异步通信、解耦和负载均衡。RabbitMQ 提供了五种常见的消息模型&#xff0c;每种模型都有其独特的特点和适用场景。本文将详细介绍这五种消息模型&#xff0…

在 VMware 中安装 Ubuntu 的超详细实战分享

目录 1. 安装准备VMware 软件获取Ubuntu 镜像获取 2. 创建新的虚拟机基础配置自定义硬件设置 3. Ubuntu 系统安装过程启动虚拟机正式安装 Ubuntu安装过程中常见问题 4. 安装后优化安装 VMware Tools系统更新与软件安装分辨率与显示设置 5. 常见故障及解决方案黑屏或安装卡顿网络…

接口测试工具:postman详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman 是一款功能强大的 API 开发和测试工具&#xff0c;以下是一些高级用法的详细介绍和操作步骤。 一、环境和全局变量 环境变量允许你设置特定于环境&#…

Gartner发布量子网络安全策略指南:2030年量子计算将能够破坏传统的加密算法

攻击者采用“先收集后解密”策略&#xff0c;为企业带来隐患。加密数据流目前无法读取&#xff0c;但可以保存&#xff0c;直到量子计算能够解密。I&O 领导者可以通过实施后量子密码学策略来降低这种风险。 主要发现 密码相关量子计算机 (CRQC) 将能够在数小时而不是数年内…

Kubernetes(K8s)集群中使用 GPU

在 Kubernetes&#xff08;K8s&#xff09;集群中使用 GPU&#xff0c;需要完成安装驱动、部署插件、配置 containerd、实现 GPU 虚拟化及部分使用等一系列步骤&#xff0c;下面为你详细介绍。 1. 安装 GPU 驱动 以 NVIDIA GPU 为例&#xff0c;因为在深度学习和机器学习场景…

大语言模型-1.3-GPT、DeepSeek模型介绍

简介 本博客内容是《大语言模型》一书的读书笔记&#xff0c;该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

【面试题系列】 Redis 核心面试题(二)答案

本文主要介绍Redis 的面试题&#xff0c;涵盖持久化、集群、缓存策略、事务等方面 一、持久化机制 1. RDB 与 AOF 的核心区别及适用场景&#xff1f; 答案&#xff1a; 特性RDBAOF存储内容内存快照&#xff08;二进制文件&#xff09;写命令日志&#xff08;文本格式&#x…

k8s面试题总结(十二)

1.简述ETCD适应的场景&#xff1f; 适用于数据高一致性的场景&#xff0c;确保分布式环境中的数据是一致的。适用于服务高可用时的场景。适用于多节点数据分布式存储的场景。适用于服务之间协调和交互使用的场景。 2.Etcd集群之间是怎么同步数据的&#xff1f; 在etcd集群中…