首页 > 编程语言 >【蓝桥杯备赛】Day13:贪心算法(倒计时30天)

【蓝桥杯备赛】Day13:贪心算法(倒计时30天)

时间:2024-03-13 21:01:04浏览次数:28  
标签:输出 杯备赛 int 30 样例 蓝桥 母舰 input 输入

题目1:题目 3040: An Easy Problem

给定一个正整数N,求最小的、比N大的正整数M,使得M与N的二进制表示中有相同数目的1。
举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。

输入格式

输入若干行,每行一个数n(1≤n≤1000000),输入"0"结束。

输出格式

输出若干行对应的值。

样例输入

1
2
3
4
78
0

样例输出

2
4
5
8
83

python代码

def searching(n):
    
    o=int(n)#n为字符串类型,取整
    one=str(bin(o)).count('1')#计算o的二进制中的含有‘1’的数量
    while True:
        o+=1
        if str(bin(o)).count('1')==one:
            print(o)
            break#找到第一个符合条件的以后必须退出,否则将会一直输出,而且题目要求找到最小的 
        


while True:
    
    n=input()
    if n=='0':
        break
    else:
        searching(n)

知识点

  1. bin(x):十进制x转化为二进制
  2. oct(x):十进制x转化为八进制
  3. hex(x):十进制x转化为十六进制
  4. str.count(i):i必须是str类型

题目2:P1223 排队接水

有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。

输入格式

共两行,第一行为n(1≤n≤1000);第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。

输出格式

输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

样例输入

10
56 12 1 99 1000 234 33 55 99 812

样例输出

3 2 7 8 1 4 9 6 10 5
291.90

python代码

n=int(input())
t_list=[int(i) for i in (input().split())]

s=0#总计等待时间
t=t_list.copy()
t.sort()#时间排序,让最短的放在前面
sorted_id=sorted(range(n),key=lambda k:t_list[k])
id=[i+1 for i in sorted_id]
for i in range(n):
    s+=t[i]*(n-i-1)

for i in range(n):
    print(id[i],end=' ')
print()
#print(t_list)
print('%.2f'%(s/n))

知识点

  1. 不知道有没有利用贪心的思想,让接水时间最短的 放在最前面,之后计算其余人等待的时间,除以人数
  2. 记录列表a递增或递减排序后的索引值:sorted_id=sorted(range(n),key=lambda k:a[k],reverse=False/True)

题目3:5399. 矩形总面积

平面上有两个矩形 R1 和 R2,它们各边都与坐标轴平行。

设 (x1,y1)和 (x2,y2)依次是 R1 的左下角和右上角坐标,(x3,y3) 和 (x4,y4)
依次是 R2的左下角和右上角坐标,请你计算 R1
和 R2的总面积是多少?

注意:如果 R1 和 R2有重叠区域,重叠区域的面积只计算一次。

输入格式

输入只有一行,包含 8 个整数,依次是: x1,y1,x2,y2,x3,y3,x4,y4

输出格式

一个整数,代表答案

样例输入

2 1 7 4 5 3 8 6

样例输出

22

python代码

x1,y1,x2,y2,x3,y3,x4,y4=map(int,input().split())


o1x=(x1+x2)/2#矩形1中点x坐标
o1y=(y1+y2)/2#矩形1中点y坐标
o2x=(x3+x4)/2#矩形2中点x坐标
o2y=(y3+y4)/2#矩形2中点y坐标
w1=abs(x2-x1)#矩形1宽度
h1=abs(y2-y1)#矩形1高度
w2=abs(x3-x4)#矩形2宽度
h2=abs(y3-y4)#矩形2高度

x_1=max(x1,x3)
y_1=max(y1,y3)
x_2=min(x2,x4)
y_2=min(y2,y4)

if abs(o1x-o2x)<(w1+w2)/2 and abs(o1y-o2y)<(h1+h2)/2: #相交
    square=h1*w1+h2*w2-abs(x_2-x_1)*abs(y_2-y_1)
elif abs(o1x-o2x)>=(w1+w2)/2 or abs(o1y-o2y)>=(h1+h2)/2:#相离
    square=h1*w1+h2*w2
else:#内含
    square=max(h1*w1,h2*w2)

print(square)
    

知识点

  1. 利用矩形中心点1 与 矩形中心点2的在x轴上的分量与在y轴上的分量 与 两矩形的宽度和或高度的一半 进行比较,当两个中心点x距离小于宽度的一半,同时两个中心点y距离小于高度的一半,即相交
  2. 当两个中心点x距离大于宽度的一半,同时两个中心点y距离大于高度的一半,相等的情况是外切,计算面积与相离等同
  3. 相交的时候,相交矩形的顶点坐标,可以通过上述方法实现

题目4:题目 2149: 信息学奥赛一本通T1321-删数问题

输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。

输出新的正整数。(n不超过240位)

输入数据均不需判错。

输入格式

n 和 s

输出格式

一个正整数,即最少需要的组数。

样例输入

175438
4

样例输出

13

python代码


n=list(input())
t=len(n)
s=int(input())

d=0#已删除个数

while d<s:
    for i in range(len(n)-1):
        flag=0#标记是否进行了删除操作
        if n[i]>n[i+1]:
            n.pop(i)
            d+=1
            flag=1
            break
    if flag==0:
        break


for i in range(s-d):
    n.pop()
    
if int(n[0])!=0:
    print(''.join(n))
else:
    for i in range(t-s):
        new=int(n[i])*pow(10,t-s-1-i)
        print(new)

知识点

  1. 一些细节问题需要考虑到位,比如使用''.join(s)拼接成一个数,那么若s[0]==0?显然不符合正常规则,或者分母为0等情况,需要进行分类讨论

题目5:题目 1197: 发工资咯

作为程序猿,最盼望的日子就是每月的9号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于公司财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小李最近就在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位员工发工资的时候都不用员工找零呢?
这里假设程序猿的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。

输入格式

输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示员工的人数,然后是n个员工的工资。
n=0表示输入的结束,不做处理。

输出格式

对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。

样例输入

3 1 2 3
0

样例输出

4

python代码

def culi(gz,n):
    cny=0#需要的纸币数量
    money=[100,50,10,5,2,1]
    for i in range(n-1,-1,-1):
        for j in range(6):
            cny+=gz[i]//money[j]
            gz[i]%=money[j]
    print(cny)
    return(cny)
    
while True:    
    gz=list(map(int,input().split()))
    n=gz[0]
    if n!=0:
        gz.pop(0)
        culi(gz,n)
    else:
        break

知识点

  1. 输入部分没有什么说的,找好思路很重要。每一份工资,整除以每一份面额,若工资小于面额,那么整除结果是0,若工资大于面额,那么整除后得到该面额的数量,之后该工资变为 之前的求余结果

题目6:题目 1357: 母舰

在小A的星际大战游戏中,一艘强力的母舰往往决定了一场战争的胜负。一艘母舰的攻击力是普通的MA(Mobile Armor)无法比较的。 对于一艘母舰而言,它是由若干个攻击系统和若干个防御系统组成的。两艘母舰对决时,一艘母舰会选择用不同的攻击系统去攻击对面母舰的防御系统。当这个攻击系统的攻击力大于防御系统的防御力时,那个防御系统会被破坏掉。当一艘母舰的防御系统全部被破坏掉之后,所有的攻击都会攻击到敌方母舰本身上去造成伤害。 这样说,一艘母舰对对面的伤害在一定程度上是取决于选择的攻击对象的。 在瞬息万变的战场中,选择一个最优的攻击对象是非常重要的。所以需要写出一个战斗系统出来,判断出你的母舰最多能对对手造成多少伤害并加以实现。

输入格式

输入第一行两个整数M和N,表示对方母舰的防御系统数量和你的母舰的攻击系统数量。 接着M行每行一个整数每一个表示对方防御系统的防御力是多少。 接着N行每行一个整数每一个表示己方攻击系统的攻击力是多少

输出格式

输出仅有一行,表示可以造成的最大伤害。

样例输入

3 5
1000
2000
1200
2100
2000
1200
1000
1000

样例输出

2000

python代码

m,n=map(int,input().split())

enemy=[]#对方母舰的防御系统
self=[]#己方母舰攻击系统
for i in range(m):
    enemy.append(int(input()))
for j in range(n):
    self.append(int(input()))
victor=0#已经攻破数量


enemy.sort(reverse=True)
self.sort()

while victor<m:
    for z in range(len(self)):
        if self[z]>enemy[0]:#攻击系统从最小开始,防御从最大开始
            victor+=1
            enemy.pop(0)
            self.pop(z)
            break
print(sum(self))

知识点

  1. 越来越感觉对题目的理解至关重要
  2. 错误思考:己方攻击系统 与 敌方防御系统 排序,然后用攻击力最大的攻击敌方最大的,直到全部攻破为止,但这样明显不是最优方案,留下的都是小炮弹,攻击力不是最大的
  3. 正确思考:防御系统从最大开始,攻击系统从最小进行遍历,找到满足条件(攻击力>防御力)且最小的攻击炮弹,列表相应删除,最后对剩余的进行加和。

题目7:题目 1361: 矩形分割

出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块。 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。 现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。

输入格式

输入文件第一行包括N和M,表示长N宽M的矩阵。 第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。 第三行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。

输出格式

输出一个整数,表示最小代价。

样例输入

2 2
3
3

样例输出

9

python代码

n,m=map(int,input().split())
s=input().split()#竖切代价(n-1个数)
h=input().split()#横切代价(m-1个数)


s=[int(l)for l in s]
h=[int(p)for p in h]

s.sort(reverse=True)
h.sort(reverse=True)
count=0#代价

i=0
j=0
x=y=1#两个方向砍出来的木板数量

while i<n-1 and j<m-1:
    if s[i]>=h[j]:#先切代价大的
        count+=s[i]*y#乘以对面方向的数量
        i+=1
        x+=1
         
    else:
        count+=h[j]*x
        j+=1
        y+=1
        
if i==n-1:
    for j in range(j,m-1):
        count+=h[j]*x
        y+=1
else:
    for i in range(i,n-1):
        count+=s[i]*y
        x+=1

print(count)

知识点

  1. 样例非常水,可以说没提供思考价值,需要充分理解题目
  2. 第二行、第三行不是说 只有1个数
  3. 横着切一刀,竖着会切两刀,因此代价大的先切

标签:输出,杯备赛,int,30,样例,蓝桥,母舰,input,输入
From: https://blog.csdn.net/qq_47461600/article/details/136596523

相关文章

  • 【机器学习300问】35、什么是随机森林?
    〇、让我们准备一些训练数据idx0x1x2x3x4y04.34.94.14.75.5013.96.15.95.55.9022.74.84.15.05.6036.64.44.53.95.9146.52.94.74.66.1152.76.74.25.34.81    表格中的x0到x4一共有5个特征,y是目标值只有0,1两个值说明是一个二分类问题。 一、决策树的局限性   ......
  • 十五届蓝桥青少C++组3月评测2024年3月中高级
    STEMA考试C++中高级试卷(24年3月10日)一、选择题(50分)1:(110010)2+(c3)16的结果是()。*选择题严禁使用程序验证,选择题不答或答错都不扣分A.(240)10 B.(11110101)2 C.(366)8 D.(f6)16 备注:此题目下标代表进制,因不支持md格式。 参考答案:B2:表达式1000/3的结果......
  • 北大最新综述精读:RAG在AIGC中的前世今生,覆盖300篇论文!
    ©作者|Haoyang来源|神州问学如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「神州问学」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和前沿资讯。引言:人工智能生成内容(AIGC)的不断发展得益于模型算法、可扩展的模型价格以及大规模......
  • 第15届蓝桥杯青少组STEMA考试C++中高级真题试卷(2024年3月)编程题部分
    编程题第6题   问答题编程实现:寒假期间小明需要做完n张试卷,但他每天最多能做完m张,请计算出小明做完n张试卷最少需要多少天?输入描述一行输入两个整数n和m(1≤n≤100,1≤m≤10),分别表示要完成的试卷张数,及每天最多能做完的试卷张数,整数之间以一个空格隔开输出描述输出......
  • npm启动vue项目报错error:0308010C:digital envelope routines::unsupported的解决办
    错误截图解决方法package.json文件中修改dev项为setNODE_OPTIONS=--openssl-legacy-provider&vue-cli-serviceserve:"scripts":{"dev":"setNODE_OPTIONS=--openssl-legacy-provider&vue-cli-serviceserve","build:prod......
  • 第十四届蓝桥杯C++B组编程题题目以及题解
    a.冶炼金属(二分)思路:设任意一条冶炼记录投入金属数量为a,产出金属为b.对于每一条冶炼记录我们都可以得到一个转换率V的范围:b<=a/v<b+1即a/b<=v<a/(b+1)为什么是b+1呢?因为既然能产出b个金属,也就意味着一定不能产出b+1个,所以a/v<b+1每一条记录都可以得到v的一个区间,我......
  • 东华OJ 进阶题30 盾神与砝码称重
    问题描述:有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了m种物品去称。神奇的是,盾神一早就知道这m种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是......
  • 代码随想录算法训练营day21 | leetcode 530. 二叉搜索树的最小绝对差、501. 二叉搜索
    目录题目链接:530.二叉搜索树的最小绝对差-简单题目链接:501.二叉搜索树中的众数-简单题目链接:236.二叉树的最近公共祖先-中等题目链接:530.二叉搜索树的最小绝对差-简单题目描述:给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,......
  • [js error] SyntaxError: Unexpected token ‘{‘ (at uniFile.js?t=1710138723630:1:
    问题详情问题描述封装一个函数的时候报错问题原因SyntaxError:Unexpectedtoken‘{’(atuniFile.js?t=1710138723630:1:34)SyntaxError:意外的令牌“{”(在uniFile.js?t=1710138723630:1:34)意思是有不符合语法规范的地方在第一行34个字符的地方去到报错文件的地方查......
  • 【蓝桥杯】(台阶方案dp)
    #include<iostream>usingnamespacestd;#defineLLlonglongconstintN=1e6+5;constLLp=1e9+7;LLdp[N];inta[3];//intmain(){LLn;cin>>n;cin>>a[0]>>a[1]>>a[2];dp[0]=1;//当目标值为0时,只有一种方案for(......