蓝桥杯第14天(Python版)

并查集的使用

# 并查集模板
N=400
fa=[]
def init():  # 初始化,默认自身为根接点
    for i in range(N):
        fa.append(i)

def merge(x,y):   # 发现可以合并,默认选x的根节点为根接点
    fa[find(x)]=find(y)

def find(x):  # 相等就是根结点,不然就递归查找根接点
    if fa[x]==x:
        return x
    else:
        fa[x]=find(fa[x])
        return fa[x]
# 并查集模板
N=int(800000)  # 注意将初始并查集设置大一点,不然可能出现段错误
fa=[]
def init():  # 初始化,默认自身为根接点
    for i in range(N):
        fa.append(i)

def merge(x,y):   # 发现可以合并,默认选x的根节点为根接点
    global ans
    if find(x)!=find(y):  # 不同才合并
        ans-=1
        fa[find(x)]=find(y)

def find(x):  # 相等就是根结点,不然就递归查找根接点
    if fa[x]==x:
        return x
    else:
        fa[x]=find(fa[x])
        return fa[x]

n,m=map(int,input().split())
k = int(input())
ans =n*m
init()  # 初始化
for i in range(k):
    a,b = map(int,input().split())
    merge(a,b)
print(ans) #合根多少次就有多少个合根植物

二分查找

关于二分法的两个模板

#在单调递增序列a中查找>=x的数中最小的一个(即x或x的后驱)
while (low<high):
    mid =(low+high)//2
    if (a[mid]>=x):
        high=mid
    else:
        low=mid+1

#-----------------------------------------------------#

#在单调递增序列a中查找<=x的数中最小的一个(即x或x的前驱)
while (low<high):
    mid =(low+high+1)//2
    if (a[mid]<=x):
        low=mid
    else:
        high=mid-1

找>=x的第一个,mid=(low+high)//2

a=[0,3,5,7,9,11,13]
# [0,1,2,3,4,5,6]
# low = 0 high =6 mid =3  ----->   low=4  high =6
# low = 4 high =6 mid =5  ----->   low=4  high =5
# low = 4 high =5 mid =4  ----->   low=5  high =5
# break   low=high=5
# 找的是靠右的那一个
low=0
high=len(a)-1
def search(low,high,x):  # 查找的是后一个
    while (low<high):
        mid =(low+high)//2   # (2+3)//2=2  偏左
        if (a[mid]>=x):
            high=mid
        else:
            low=mid+1
    print(a[low])
    print(a[high])
search(low,high,10)  # 查找结果10

找<=x的第一个,mid=(low+high+1)//2

a=[0,3,5,7,9,11,13]
# [0,1,2,3,4,5,6]
# low = 0 high =6 mid =3  ----->   low=3  high =6
# low = 3 high =6 mid =5  ----->   low=3  high =4
# low = 3 high =4 mid =4  ----->   low=4  high =4
# break   low=high=4
# 找的是靠左的那一个
low=0
high=len(a)-1
def search(low,high,x):  # 查找的是前一个
    while (low<high):
        mid =(low+high+1)//2   # (2+3+1)//2=3  偏右
        if (a[mid]<=x):
            low=mid
        else:
            high=mid-1
    print(a[low])
    print(a[high])
search(low,high,10)  # 查找结果10


一元三次方程求解

#一半测试案例错误 已改正,注意学会使用continue语句

import os
import sys

# 请在此输入您的代码
ans =[]
def f(x):  # 函数
  return x*x*x*a+x*x*b+x*c+d  

def search(x1,x2):
  for i in range(30):
    mid=(x1+x2)/2
    if f(x1)*f(mid)<0:
      x2=mid
    else:
      x1=mid
  ans.append(x1)
a,b,c,d = map(float,input().split())
for i in range(-100,100): # 100取不到,最后需单独判断
  if f(i)==0:
    ans.append(i)
    continue
  else:
    if f(i)*f(i+1)<0:  # 有根
      search(i,i+1)

if f(100)==0:
  ans.append(100)

ans.sort()
for i in ans:
  print('{:.2f}'.format(i),end=' ')

标注答案(我感觉没判断f(100)处)

n = input().split()
a,b,c,d = eval(n[0]),eval(n[1]),eval(n[2]),eval(n[3])
def y(x):
   return a*x*x*x+b*x*x+c*x+d
for i in range(-100,100):
   left=i
   right=i+1
   y1=y(left)
   y2=y(right)
   if y1==0:  print("{:.2f}".format(left),end=" ")
   if y1*y2<0 :
       while (right-left) >= 0.001:                 #eps=0.001
           mid = (left+right)/2
           if y(mid)*y(right) <=0: left = mid
           else:                   right = mid
       print("{:.2f}".format(right),end=" ")

求立方根问题

学会善用break语句,continue语句

之前写的有问题的(判断条件有问题的)

t = int(input())
for _ in range(t):
    a= int(input())
    for i in range(0,10000,1):
        if i*i*i=<a and (i+1)*(i+1)*(i+1)>=a:  #问题处在这里,例如求8时 i=1,2
            if i*i*i==a:
                print("{:.3f}".format(i))
                break
            else:
                left=i;right=i+1
                for _ in range(10):
                    mid=(left+right)/2
                    if mid*mid*mid > a:
                        right=mid
                    else:
                        left =mid
                print('{:.3f}'.format(left))
                break
 

#自我改进写法,改正后答案

t = int(input())
for _ in range(t):
    a= int(input())
    for i in range(0,10000,1):
        if i*i*i==a:
                print("{:.3f}".format(i))
                break
        if i*i*i>a:
                left=i-1;right=i
                for _ in range(10):
                    mid=(left+right)/2
                    if mid*mid*mid > a:
                        right=mid
                    else:
                        left =mid
                print('{:.3f}'.format(left))
                break

分蛋糕问题

#暴力方法做的 75%通过率,会超时

import os
import sys

# 请在此输入您的代码
n,k = map(int,input().split())
length = 1
save=[]
for i in range(n):
  save.append(list(map(int,input().split())))
for i in range(1,1000):  #遍历大小
  mark=0
  for x,y in save:
    mark += (x//i)*(y//i)
  if mark<k:  # 当前分法不够分
    continue
  length = max(length,i)
print(length)

#二分法解决

注意是找<=x的第一个,应该用
mid=(left+right+1)//2 
    True:
        left=mid
    False:
        right=mid-1
import os
import sys

# 请在此输入您的代码
def check(d):  # 检查蛋糕大小为d是否可分
  num = 0
  for i in range(n):
    num+=(w[i]//d)*(h[i]//d)
  if(num>=k):return True
  else:return False

h = [0]*100010
w = [0]*100010
n,k = map(int,input().split())
for i in range(n):  # 读入蛋糕大小
  h[i],w[i] = map(int,input().split())

L,R = 1,100010   # 结尾更大防止出现边界问题
while L<R:
  mid=(L+R+1)//2    #偶数中值为左值  [1,2] -->1  ,没有则取后
  if(check(mid)): # 当前分发可分,二分法取左值
    L=mid
  else:
    R=mid-1
print(L)

翻硬币问题

贪心,从左到右遍历。关键在与当发现不同,只需要更改后面的值即可,同时ans++
import os
import sys

# 请在此输入您的代码
ans=0
# 因为要反转,即改变值,字符串不能改变,所以转为列表处理
begin = list(input())
end = list(input())
for i in range(len(begin)-1):  # 每次翻两个,只能遍历到 [1 - n-1]
  if begin[i]!=end[i]: # 翻转
    if begin[i+1]=='*':
      begin[i+1]='o'
    else:
      begin[i+1]='*'
    ans+=1   #记录翻转次数
print(ans)

巧克力

n, kind = map(int, input().split())
all_list = []  # 存储信息
for i in range(kind):
   info_list = [int(i) for i in input().split(' ')]
   all_list.append(info_list)
all_list.sort(key=lambda x: x[0])  # 按照单价从大到小排序


def solve(n, all_list):
   c = 0
   days = [i for i in range(1, n+1)]  # [1-n] 天
   days = sorted(days, reverse=True)  # 从大到小排序
   for i in days:
       tmp_c = 0
       for j in all_list:
           if j[2] > 0:   #还剩下货物
               if j[1] >= i:  # 是否大于保质期
                   tmp_c += j[0]
                   index = all_list.index(j)  # 更新剩余量
                   all_list[index][2] -= 1
                   break  # 记录了一天,弄另一天
       if tmp_c == 0:
           return -1
       else:
           c += tmp_c
   return c


print(solve(n, all_list))
建议的写法:
根据单价排序后,创建一个列表来记录每天吃什么,首先判断是否还有,然后判断是否过保质期,没过就添加,过了就选择下一款,选择了就break,选择下一天的食物
n, kind = map(int, input().split())
all_list = []  # 存储信息
for i in range(kind):
   info_list = [int(i) for i in input().split(' ')]
   all_list.append(info_list)
all_list.sort(key=lambda x: x[0])  # 按照单价从小到大排序
#print(all_list)

def solve(n, all_list):
   c = 0
   days = [i for i in range(1, n+1)]  # [1-n] 天
   #days = sorted(days, reverse=True)  # 从大到小排序
   for i in days:
       tmp_c = 0
       for j in all_list:
           if j[2] > 0:   #还剩下货物
               if j[1] >= i:  # 是否大于保质期
                   tmp_c += j[0]
                   index = all_list.index(j)  # 更新剩余量
                   all_list[index][2] -= 1
                   break  # 记录了一天,弄另一天
       if tmp_c == 0:
           return -1
       else:
           c += tmp_c
   return c


print(solve(n, all_list))

顺子日期(手算题)

import os
import sys

# 请在此输入您的代码
# 2022  #非闰年  year%400==0 or( year %4==0 and year%100!=0)
#012 10 [0-9]  
#02
#03
#04
#05
#06
#07
#08
#09
#10   1  12
#11   1  23
#123  2 [0-1]


print(14)

平方和(送分)

import os
import sys

# 请在此输入您的代码
ans=0
mark=['2','0','1','9']
for i in range(1,2020):
  #if( '2' or '0'or '1'or'9' in str(i)):  #这样的话相当于累加1-2019的所有数,判定条件有问题
  for j in mark:
    if j in str(str(i)):
      ans+=i*i
      break
print(ans)

乘积求0(送分)

a = '''5650 4542 3554 473 946 4114 3871 9073 90 4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
1486 5722 3135 1170 4014 5510 5120 729 2880 9019 
2049 698 4582 4346 4427 646 9742 7340 1230 7683 
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
6701 6645 1671 5978 2704 9926 295 3125 3878 6785 
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
689 5510 8243 6114 337 4096 8199 7313 3685 211'''
a = a.split()
b=1
c=0
for i in a:
    b=b*int(i) #计算结果
b=str(b)
b=b[::-1]  # 倒叙查看看有多少个0
for j in b:
    if j=='0':
        c+=1
    else:
        break
print(c)

蓝肽子序列

审题:思路上是求最大子序列,需要注意将原来的序列分隔,用到的方法有str.upper()方法,以及注意索引出界问题,同时将dp数组转为下标从1开始处理
import os
import sys

# 请在此输入您的代码
# 公共子序列问题
# 给他添加结尾,便于分隔,避免出现索引出界问题
ss1=input()+' '
ss2=input()+' '
s1=['']
s2=['']
# 分隔序列
temp_s=''
i=0
while i <len(ss1)-1:
  temp_s+=ss1[i]
  if(ss1[i+1]==' '):
    break
  if(ss1[i+1].isupper()):
    s1.append(temp_s)
    temp_s=''
  i+=1
s1.append(temp_s)
temp_s=''
i=0
while i <len(ss2)-1:
  temp_s+=ss2[i]
  if (ss2[i + 1] == ' '):
    break
  if(ss2[i+1].isupper()):
    s2.append(temp_s)
    temp_s=''
  i+=1
s2.append(temp_s)

dp=[[0]*1001 for i in range(1001)]
for i in range(1,len(s1)):
  for j in range(1,len(s2)):
    if s1[i]==s2[j]:
      dp[i][j]=dp[i-1][j-1]+1
    else:
      dp[i][j]=max(dp[i-1][j],dp[i][j-1])
print(dp[len(s1)-1][len(s2)-1])  #下标索引从1开始,
# print(s1)
# print(s2)
# s1=012  len(s1) = 3

合唱队形

#这里的代码思想贪心,没有维护最值这些情况,只能过10%的点,有问题

import os
import sys

# 请在此输入您的代码
n=int(input())
a = list(map(int,input().split()))
#print(sorted(save))   # [130, 150, 160, 186, 186, 197, 200, 220]
# 原序列,抽人,不要动相应位置
i,j=0,len(a)-1
ans=0
while (i<j):
  if(a[i]>=a[i+1]):
    ans+=1
    i+=1
    continue
  if(a[j]>=a[j-1]):
    ans+=1
    j-=1
    continue
  while a[i]<a[i+1]:
    i+=1
  while a[j]<a[j-1]:
    j-=1
print(ans)

标准答案

if __name__ == "__main__":

    # 输入并赋初值
    n = int(input().strip())

    t = list(map(int, input().split()))

    dp1 = [1] * n
    dp2 = [1] * n

    # 预处理,从左往右LIS
    for i in range(1, n):
        for j in range(i):
            if t[i] > t[j]:
                dp1[i] = max(dp1[i], dp1[j] + 1)

    # 预处理,从右往左LIS
    for i in range(n - 1, 0, -1):
        for j in range(n - 1, i, -1):
            if t[i] > t[j]:
                dp2[i] = max(dp2[i], dp2[j] + 1)


    maxx = 0

    for i in range(n):
        maxx = max(maxx, dp1[i] + dp2[i] - 1)
        # 自己算了两次,所以-1
        
    print(n - maxx)
    

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

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

相关文章

Vue3监听器使用

watch(监听的对象或值, 回调函数&#xff08;参数新值&#xff0c;旧值&#xff09;, 配置项是对象{ immediate: true//立即监听--进入就会执行一次 deep&#xff1a;true //深度监听 }) 首先引入 import { ref, watch } from vue; 设置响应式数据 const num ref(1) …

【数据结构篇C++实现】- 栈

文章目录&#x1f680;一、栈的原理精讲&#x1f680;二、栈的算法实现⛳栈的顺序存储结构&#x1f389;&#xff08;一&#xff09;顺序栈1.栈的结构体定义2.栈的初始化3.判断空栈4.判断栈满5.元素入栈6.元素出栈7.获取栈顶元素&#x1f389;&#xff08;二&#xff09;共享栈…

冯诺依曼,操作系统以及进程概念

文章目录一.冯诺依曼体系结构二.操作系统&#xff08;operator system&#xff09;三.系统调用和库函数四.进程1.进程控制块&#xff08;PCB&#xff09;2.查看进程3.系统相关的调用4.fork介绍&#xff08;并发引入&#xff09;五.总结一.冯诺依曼体系结构 计算机大体可以说是…

MD5加密竟然不安全,应届生表示无法理解?

前言 近日公司的一个应届生问我&#xff0c;他做的一个毕业设计密码是MD5加密存储的&#xff0c;为什么密码我帮他调试的时候&#xff0c;我能猜出来明文是什么&#xff1f; 第六感&#xff0c;是后端研发的第六感&#xff01; 正文 示例&#xff0c;有个系统&#xff0c;前…

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度强化学习中的近端策略优化算法&#xff08;proximal policy optimization&#xff0c;PPO&#xff09;&#xff0c;并借助 OpenAI 的 gym 环境完成一个小案例&#xff0c;完整代码可以从我的 GitHub 中获得&#xff1a; https://gith…

泰克信号发生器特点

泰克信号发生器是一种用于产生各种类型的电子信号的仪器&#xff0c;可以广泛应用于电子、通信、自动化、医疗等领域。泰克信号发生器具有以下特点&#xff1a;多种信号类型&#xff1a;泰克信号发生器可以产生多种类型的电子信号&#xff0c;包括正弦波、方波、三角波、脉冲等…

TitanIDE:云原生开发到底强在哪里?

原文作者&#xff1a;行云创新技术总监 邓冰寒 引言 是一种新的软件开发方法&#xff0c;旨在构建更可靠、高效、弹性、安全和可扩展的应用程序。与传统的应用程序开发方式不同&#xff0c;云原生是将开发环境完全搬到云端&#xff0c;构建一站式的云原生开发环境。云原生的开…

PWM互补输出,以及死区时间计算

本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波&#xff0c;且进行死区时间的计算说明。 代码 互补输出对应的定时器初始化代码&#xff1a; bsp_advance_tim.c /********************************************************************************* fi…

【YOLO】YOLOv8训练自定义数据集(4种方式)

YOLOv8 出来一段时间了&#xff0c;继承了分类、检测、分割&#xff0c;本文主要实现自定义的数据集&#xff0c;使用 YOLOV8 进行检测模型的训练和使用 YOLOv8 此次将所有的配置参数全部解耦到配置文件 default.yaml&#xff0c;不再类似于 YOLOv5&#xff0c;一部分在配置文件…

Anaconda 的安装配置及依赖项的内外网配置

在分享anaconda 的安装配置及使用前&#xff0c;我们必须先明白anaconda是什么&#xff1b;Anaconda是一个开源的Python发行版本。两者区别在于前者是一门编程语言&#xff0c;后者相当于编程语言中的工具包。 由于python自身缺少numpy、matplotlib、scipy、scikit-learn等一系…

Java中的深拷贝和浅拷贝

目录 &#x1f34e;引出拷贝 &#x1f34e;浅拷贝 &#x1f34e;深拷贝 &#x1f34e;总结 引出拷贝 现在有一个学生类和书包类&#xff0c;在学生类中有引用类型的书包变量&#xff1a; class SchoolBag {private String brand; //书包的品牌private int size; //书…

7.网络爬虫—正则表达式详讲

7.网络爬虫—正则表达式详讲与实战Python 正则表达式re.match() 函数re.search方法re.match与re.search的区别re.compile 函数检索和替换检索&#xff1a;替换&#xff1a;findallre.finditerre.split正则表达式模式常见的字符类正则模式正则表达式模式量词正则表达式举例前言&…

2022财报逆转,有赞穿透迷雾实现突破

2022年&#xff0c;商家经营面临困难。但在一些第三方服务商的帮助下&#xff0c;也有商家取得了逆势增长。 2023年3月23日&#xff0c;有赞发布2022年业绩报告&#xff0c;它帮助许多商家稳住了一整年的经营。2022年&#xff0c;有赞门店SaaS业务的GMV达到425亿元&#xff0c…

24万字智慧城市顶层设计及智慧应用解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。部分资料内容&#xff1a; 4.8 机房消防系统 4.8.1消防系统概况 根据本工程机房消防系统的特殊要求&#xff0c;整个消防系统由火灾报警系统、消防联动系统和气体灭火系统三部…

常见的嵌入式微处理器(Micro Processor Unit,MPU)

嵌入式微处理器是由通用计算机中的CPU演变而来的。它的特征是具有32位以上的处理器&#xff0c;具有较高的性能&#xff0c;当然其价格也相应较高。但与计算机处理器不同的是&#xff0c;在实际嵌入式应用中&#xff0c;只保留和嵌入式应用紧密相关的功能硬件&#xff0c;去除了…

医院陪诊系统源码,可以提供新的就医方式

随着人们生活水平的提高和医疗服务的进步&#xff0c;越来越多的人们开始注重家庭健康和医疗保健。在这个背景下&#xff0c;陪护系统和医院陪诊系统应运而生&#xff0c;成为了现代医疗服务领域中的重要组成部分。 陪护系统是一种为患者提供家庭养护服务的机构&#xff0c;它…

“蓝桥杯”递推和递归(一)——取数位

1. 算法简介 递推和递归虽然叫法不同&#xff0c;但它们的基本思想是一致的&#xff0c;在很多程序中&#xff0c;这两种算法可以通用&#xff0c;不同的是递推法效率更高&#xff0c;递归法更方便阅读。 &#xff08;1&#xff09;递推法 递推法是一种重要的数学方法&#…

【PC自动化测试-4】inspect.exe 详解

1&#xff0c;inspect.exe图解" 检查 "窗口有几个主要部分&#xff1a;● 标题栏。 显示" 检查 HWND (窗口句柄) 。● 菜单栏。 提供对 检查功能 的访问权限。● 工具 栏。 提供对 检查功能 的访问权限。● 树视图。 将 UI 元素的层次结构呈现为树视图控件&…

【超好懂的比赛题解】暨南大学2023东软教育杯ACM校赛个人题解

title : 暨南大学2023东软教育杯ACM校赛 题解 tags : ACM,练习记录 date : 2023-3-26 author : Linno 文章目录暨南大学2023东软教育杯ACM校赛 题解A-小王的魔法B-苏神的遗憾C-神父的碟D-基站建设E-小王的数字F-Uziの真身G-电子围棋H-二分大法I-丁真的小马朋友们J-单车运营K-超…

JavaScript实现列表分页(小白版)

组件用惯了&#xff0c;突然叫你用纯cssJavaScript写一个分页&#xff0c;顿时就慌了。久久没有接触js了&#xff0c;不知道咋写了。本文章也是借与参考做的一个demo案例&#xff0c;小白看了都会的那种。咱们就以ul列表为例进行分页&#xff1a; 首先模拟的数据列表是这样的&a…