蓝桥杯(2):python基础算法【下】

贪心、双指针、二分

11 贪心

11.1 定义

11.2 适用情况

如何判断???!

11.3 实例

11.3.1 石子合并

只考虑一步,每次都找最小的

那么问题的核心就是:如何选出最小的!

#石子合并
import heapq

n = int(input())
a =list(map(int,input().split()))

#堆每次弹出最小值
heapq.heapify(a)
ans = 0
while len(a)>=2:
    x = heapq.heappop(a)
    y = heapq.heappop(a)
    heapq.heappush(a,x+y)
    ans += x+y
print(ans)

11.3.2 分组问题(纪念品分组)

w=int(input())
n=int(input())
a=[]#创建一个空列表
for i in range(n):
    a.append(int(input()))  #遍历n次,每次输入一个数,添加到a列表上去
a.sort()  #把输入的数组排序
ans=0
l,r = 0,n-1  #下标

while True:
    if l==r: #此时只有一个中间值,单独为一组
        ans += 1
        break
    if l>r:  #直接停止循环
        break
    if a[l]+a[r] <=w:
        l += 1
        r -= 1
        ans += 1
    else:
        r -= 1
        ans += 1
print(ans)

11.3.3 翻硬币问题

翻的时候一下翻两个!

a=list(str(input()))
b=list(str(input()))
ans=0
for i in range(len(a)):
  
  if a[i]!=b[i]:
    if a[i]=="*":
      a[i]="o"
    else:
       a[i]="*"
    if a[i+1]=="*":
      a[i+1]="o"
    else:
       a[i+1]="*"
    ans+=1
print(ans)

12 双指针

12.1 定义

双指针!!!

一般用于列表或者字符串里

12.2 例子

12.2.1 回文字符串

从前面读和从后面读是一样的

#回文字符串
#方法一
s = input()
i = 0
l = len(s)-1
while i<=l:
    if s[i]==s[l]:
        i = i+1
        l = l-1
        continue
    # print("Yes")
    else:
        print("NO")
        break
#方法2
s = input()
s1 = s[::-1]
if s ==s1:
    print("YES")
else:
    print('NO')

12.2.2 通向扫描(滑动窗口)

#滑动窗口找美丽区间
def input_list():
    return list(map(int,input().split()))


n,s = input_list()
#n是列表的长度
# print(type(n))
a = input_list()
l = 0
r = -1
len_list = []
tot = 0
#判断while超界不的主要依据要综合list!!!!一起看就不会纠缠在一起了!!!!!!!!!
while l<=n-1:

    while r<n-1 and tot <s:
        r += 1
        tot += a[r]

    if tot >= s:
        len_ =r-l+1
        print('左边是:',l)
        print('右边是:',r)
        print(len_)
        # print(len)
        len_list.append(len_)

    tot -=a[l]
    l = l+1
print(len_list)
if len(len_list) ==0:
    print("没有美丽区间")
else:
    print("最美丽区间长度为:",(min(len_list)))

12.2.3 挑选字串

#挑选字串
def input_list():
    return list(map(int,input().split()))

n,m,k=input_list()
#n个数
#k个数字大于m
a = input_list()
#a是数组
l = 0
r = -1
cnt = 0
ans = 0
while l <= n-1:
    while r < n-1 and cnt < k:
        r += 1
        if a[r] >= m:
            cnt += 1

    if cnt >= k:
        ans += n-r

    if a[l] >= m:
        cnt -= 1
    l += 1


print(ans)

13 二分

13.1 定义

二分法的前提:单调性??!

例子:

题目中一般涉及的是 整数的二分法!

二分代码的模板

13.2 例子

【pay attention!!!:最大最小化谁 就把谁二分!】

13.2.1 分巧克力

找到单调性:(才可以用二分法!!)

x越大k越小

#分巧克力
def input_list():
    return list(map(int,input().split()))


#当边长为x的时候,是否可以切除k个巧克力
def check(x,a,k):
    cnt = 0#表示能切除的块数
    for H,W in a:
        cnt += (H//x)*(W//x)
    return cnt >=k


N,K = input_list()
#N块巧克力 K位小朋友
a =[]
for i in range(N):
    H_W = input_list() #N块巧克力的尺寸
    a.append(H_W)

#找到边长
l = 1#边长是1 的时候肯定成立
r = 100000
ans = 1
while l <=r:
    mid = (l+r)//2
    if check(mid,a,K):
        ans = mid
        l = mid+1
    else:
        r = mid-1
print(ans)

13.2.2 跳石头

找到单调性:移走的石头越多那么最短跳跃距离越大!

求解:最短跳跃距离最大的这种问题可以提炼称【最小值最大化、最大值最小化等】这种问题一般就要使用二分法!

# 跳石头
def input_list():
    return list(map(int,input().split()))

#当最短距离是x的时候,撤M个延时是否能够满足
def check(x,a,M):
    cnt = 0#表示移走的岩石数
    last_idx = 0
    for i in range(1,len(a)-1):
        if a[i] - a[last_idx]>=x:
            last_idx = i
        else:
            cnt += 1#不满足这个石头挪走
    if a[len(a)-1] - a[last_idx] >=x and cnt <=M:
        return True




L,N,M = input_list()
#一共N块岩石,最多挪走M个
#L表示岩石距离起点距离的上界
a = [0]
for i in range(N):
    a.append(int(input()))

l = 1
r = 1000000000
ans = 1

while l <=r:
    mid = (l+r)//2
    if check(mid,a,M):
        ans = mid
        l = mid+1
    else:
        r = mid-1

print(ans)

13.2.3 肖恩的乘法表

意思就是:第二行就是 第一行对应乘以2就可以

找到排序之后的第k个元素》》》则二分的对象是k 

单调性是:k大则比k小的数多;k小比k小的数少

#肖恩乘法表
def input_list():
    return list(map(int,input().split()))


n,m,k = input_list()
#n行m列,求排在第k位的元素

#求出小于x的有几个
def check(x,n,m,k):
    cnt = 0
    for i in range(1,n+1):
        # i,2i,3i,4i,...,mi
        #m * i <x >>>> m <x//i
        cnt += min(m,x//i)
    if cnt >= k:
        return True


ans = 0
l = 0
r = n*m
while l <=r:
    mid = (l+r) //2
    if check(mid,n,m,k):
        ans = mid
        r = mid-1
    else:
        l = mid +1

print(ans)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch神经网络-元组/列表如何喂到神经网络中

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

GPT2从放弃到入门(二)

引言 本文介绍如何利用GPT2从零训练一个多轮对话聊天机器人&#xff0c;按照本文的思路可以轻松地训练自己的数据。 数据处理 ⚠️ 这是本文的核心部分&#xff0c;其他的内容甚至可以不用看。 本小节阐述多轮对话数据的处理。 数据来自网上的一份开源数据&#xff1a;htt…

【c++入门】命名空间,缺省参数与函数重载

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff01;本篇内容我们进入一个新的阶段&#xff0c;进入c的学习&#xff01;希望我的博客内容能对你有帮助&#xff01; 目录 1.c关键字2.第一个c代码3.命名空间3.1 nam…

Linux - 线程互斥和互斥锁

文章目录 前言一、为什么要线程互斥原子性 二、互斥锁互斥锁的创建与销毁互斥锁进行互斥 前言 前几节课&#xff0c;我们学习了多线程的基础概念&#xff0c;这节课&#xff0c;我们来对线程互斥和互斥锁的内容进行学习。 一、为什么要线程互斥 首先我们要明白&#xff0c;对…

AOP切面编程

1.基本概念&#xff1a; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;&#xff0c;跟oop面向过程编程相对&#xff0c;AOP一般用于将公共逻辑和业务逻辑进行拆分&#xff0c;可以减少代码间的耦合性。 有道翻译&#xff1a;AOP—面向切面…

jsp2024.3.21(4) html基础

一、实验目的 1、html 文件的基本结构&#xff1b; 2、html 的常用标记&#xff1b; <HTML> <HEAD> …… </HEAD> <BODY> …… </BODY> </HTML> 二、实验项目内容&#xff08;实验题目&#xff09; HTML常用标记 1&#xff0e;<…

C语言数据在内存中的存续:一篇文章让你秒懂基础!

JAMES别扣了-CSDN博客 &#x1f495;在校大学生一枚。对IT有着极其浓厚的兴趣 ✨系列专栏目前为C语言初阶、后续会更新c语言的学习方法以及c题目分享. &#x1f60d;希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c;我也会回关&#xff0c;大家一起交…

LeetCode 热题 100 | 堆(一)

目录 1 什么是堆排序 1.1 什么是堆 1.2 如何构建堆 1.3 举例说明 2 215. 数组中的第 K 个最大元素 2.1 子树大根化 2.2 遍历所有子树 2.3 弹出栈顶元素 2.4 完整代码 菜鸟做题&#xff0c;语言是 C 1 什么是堆排序 1.1 什么是堆 堆的定义和分类&#xff…

为什么Hashtable不允许插入nuIl键和null值?

1、典型回答 浅层次的来回答这个问题的答案是&#xff0c;JDK 源码不支持 Hashtable 插入 value 值为 null&#xff0c;如以下 JDK 源码所示&#xff1a; 也就是 JDK 源码规定了&#xff0c;如果你给 Hashtable 插入 value 值为 null 就会抛出空指针异常。 并且看上面的 JDK …

如何搭建DolphinScheduler服务并结合内网穿透公网远程任务调度

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

Stable Diffusion WebUI 生成参数:宽度/高度/生成批次/每批数量/提示词相关性/随机种子

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文将继续了解 Stable Diffusion WebUI 的生成参数&#xff0c;主要内容有&#xff1a;宽度、高度、生成批次、每批数量、提示词相关性、随机种子。希望能对你…

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 并训练自己的数据集

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 概述 大模型微调(finetuning)以适应特定任务是一个复杂且计算密集型的过程。本文训练测试主要是基于主流的的微调方法:LoRA、Adapter、Prefix-tuning、P-tuning和Prompt-tuning,并对…

STM32驱动CC1101时的正确配置和一些遇到的坑

项目背景 由于项目需要用到CC1101-Q1,所以买了CC1101的模块和驱动底板,插电脑上一发一收。串口调试助手查看接收端的数据,测试正常。 然后想用STM32来驱动其中的一块CC1101模块作为发送端,和另一个买来的接收端测试通信。找到一份STM32驱动CC1101Demo代码,分为软件模拟S…

Certum代码签名证书

代码签名证书是一种数字证书&#xff0c;用于验证软件开发者身份和保证软件完整性的技术。它的作用在于确保软件在传输和安装过程中没有被篡改或损坏&#xff0c;并且确认软件来自可信的开发者。通过代码签名证书&#xff0c;用户可以更放心地下载和安装软件&#xff0c;降低安…

【Linux】文件描述符 - fd

文章目录 1. open 接口介绍1.1 代码演示1.2 open 函数返回值 2. 文件描述符 fd2.1 0 / 1 / 22.2 文件描述符的分配规则 3. 重定向3.1 dup2 系统调用函数 4. FILE 与 缓冲区 1. open 接口介绍 使用 man open 指令查看手册&#xff1a; #include <sys/types.h> #include …

AI系统性学习06—开源中文语言大模型

1、ChatGLM ChatGLM-6B的github地址&#xff1a;https://github.com/THUDM/ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级…

透视未来工厂:山海鲸可视化打造数字孪生新篇章

在信息化浪潮的推动下&#xff0c;数字孪生工厂项目正成为工业制造领域的新宠。作为一名山海鲸可视化的资深用户&#xff0c;我深感其强大的数据可视化能力和数字孪生技术在工厂管理中的应用价值&#xff0c;同时我们公司之前也和山海鲸可视化合作制作了一个智慧工厂项目&#…

OceanBase生产环境安装部署的最优实践

关于生产环境&#xff0c;为了尽量确保性能和稳定性&#xff0c;我们比较建议采用标准化的配置进行部署&#xff0c;例如接下来会提到的服务初始化、日志管理和数据分盘等关键步骤。而在非生产环境中&#xff0c;如果条件满足&#xff0c;同样建议遵循规范部署的原则。 前期准备…

项目实战-开发工具入门/基本框架搭建/项目初始化/引入组件库

上周更新完了之前vue3的shopping项目&#xff0c;接下来&#xff0c;将会开启一个新的项目&#xff0c;效果是类似于移动端的一个伙伴匹配项目&#xff0c;今天这篇文章从需求分析到架构设计再到项目初始化&#xff0c;基本框架搭建几个部分来为大家详细介绍。 从这个项目开始…

YOLOV5 改进:替换backbone为Swin Transformer

1、前言 本文会将YOLOV5 backbone更换成Swin Transformer 具体为什么这样实现参考上文:YOLOV5 改进:替换backbone(MobileNet为例)-CSDN博客 这里只贴加入的代码 训练结果如下: 2、common文件更改 在common文件中加入下面代码: 这里是swin transformer的实现,参考:…