2024蓝桥杯每日一题(贪心)

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:修理牛棚
        试题二:区间选点
        试题三:耍杂技的牛
        试题四:三国游戏
        试题五:平均
        试题六:填充游戏


试题一:修理牛棚

【题目描述】

        在一个下着暴风雨的夜晚,大风掀翻了农夫约翰的牛棚的屋顶和大门。牛棚一个个的并排排成一排,奶牛就住在牛棚中过夜。由于一些奶牛正在外面度假,牛棚并没有住满,有的牛棚住着牛,有的牛棚空着。所有的棚子的宽度都相同。现在,约翰需要订购一批木板用来挡在牛棚的门口。木材供应商将为他提供任意长度的木板,但是能够提供的木板数量非常有限。约翰希望他购买的木板的总长度尽可能的小。现在,给定可以购买的最大木板数量 M,牛棚的总数 S,牛的总数 C,以及 C 个住着牛的牛棚编号。请你计算确保购买的木板的总长度尽可能小的情况下,为了使所有住着牛的牛棚都用木板挡住门,最少要将多少牛棚的门用木板挡住。

【输入格式】

        第一行包含三个整数 M,S,C。

        接下来 C 行,每行包含一个整数,表示一个住着牛的牛棚的编号。

【输出格式】

        输出一个整数,表示被木板挡住门的牛棚的数量。

【数据范围】

        1≤M≤50
        1≤S≤200
        1≤C≤S
        牛棚编号依次为 1∼S

【输入样例】

4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43

【输出样例】

25

【解题思路】

        反向思考,去掉m-1块。

【Python程序代码】

m,s,c = map(int,input().split())
a = []
for i in range(c):
    a.append(int(input()))
a.sort()
b = []
total = a[len(a)-1]-a[0]+1
for i in range(1,len(a)):
    b.append(a[i]-a[i-1]-1)
b.sort(reverse=True)
for i in range(min(m-1,len(b))):
    total -= b[i]
print(total)

试题二:区间选点

【题目描述】

        给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。

【输入格式】

        第一行包含整数 N,表示区间数。

        接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

【输出格式】

        输出一个整数,表示所需的点的最小数量。

【数据范围】

        1≤N≤105
        −109≤ai≤bi≤109

【输入样例】

3
-1 1
2 4
3 5

【输出样例】

2

【解题思路】

        这类问题要么按第一个数排序,要么按第二个数排序,如果第一个数排序好像不行,那么就是第二个数。

【Python程序代码】

n = int(input())
a = []
for i in range(n):
    x,y = map(int,input().split())
    a.append([x,y])
def cmp(x):
    return (x[1],x[0])
a.sort(key=cmp)
res = 0
st = -2e9
for i in range(n):
    l,r = a[i]
    if l>st:
        res += 1
        st = r
print(res)

试题三:耍杂技的牛

【题目描述】

        农民约翰的 N 头奶牛(编号为 1..N)计划逃跑并加入马戏团,为此它们决定练习表演杂技。奶牛们不是非常有创意,只提出了一个杂技表演:叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠。奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。这 N 头奶牛中的每一头都有着自己的重量 Wi 以及自己的强壮程度 Si。一头牛支撑不住的可能性取决于它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,现在称该数值为风险值,风险值越大,这只牛撑不住的可能性越高。您的任务是确定奶牛的排序,使得所有奶牛的风险值中的最大值尽可能的小。

【输入格式】

        第一行输入整数 N,表示奶牛数量。

        接下来 N 行,每行输入两个整数,表示牛的重量和强壮程度,第 i 行表示第 i 头牛的重量 Wi 以及它的强壮程度 Si。

【输出格式】

        输出一个整数,表示最大风险值的最小可能值

【数据范围】

        1≤N≤50000
        1≤Wi≤10,000
        1≤Si≤1,000,000,000

【输入样例】

3
10 3
2 5
3 3

【输出样例】

2

【解题思路】

        s+w排序

【Python程序代码】

n = int(input())
a = [] 
for i in range(n):
    x,y = map(int,input().split())
    a.append([x+y,y])
a.sort(reverse=True)
res = -1e12
pre = 0
a.append([0,0])
for i in range(n-1,-1,-1):
    xy,y = a[i]
    prexy,prey = a[i+1]
    prex = prexy-prey
    pre += prex
    res = max(res,pre-y)
print(res)

试题四:三国游戏

【题目描述】

        小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z(一开始可以认为都为 0)。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X,Y,Z 增加 Ai,Bi,Ci。当游戏结束时 (所有事件的发生与否已经确定),如果 X,Y,Z 的其中一个大于另外两个之和,我们认为其获胜。例如,当 X>Y+Z 时,我们认为魏国获胜。小蓝想知道游戏结束时如果有其中一个国家获胜,最多发生了多少个事件?如果不存在任何能让某国获胜的情况,请输出 −1

【输入格式】

        输入的第一行包含一个整数 n。

        第二行包含 n 个整数表示 Ai,相邻整数之间使用一个空格分隔。

        第三行包含 n 个整数表示 Bi,相邻整数之间使用一个空格分隔。

        第四行包含 n 个整数表示 Ci,相邻整数之间使用一个空格分隔。

【输出格式】

        输出一行包含一个整数表示答案

【数据范围】

        对于 40%40% 的评测用例,n≤500
        对于 70%70% 的评测用例,n≤5000
        对于所有评测用例,1≤n≤105,0≤Ai,Bi,Ci≤109
        注意,蓝桥杯官方给出的关于 Ai,Bi,Ci的数据范围是 1≤Ai,Bi,Ci≤109,但是这与给出的输入样例相矛盾,因此予以纠正。

【输入样例】

3
1 2 2
2 3 2
1 0 7

【输出样例】

2

【解题思路】

        初始化ai-bi-ci,三种情况的,然后排个序,枚举谁获胜的场数多。

【Python程序代码】

n = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
C = list(map(int,input().split()))
sumA = sorted( [ A[_]-B[_]-C[_] for _ in range(n) ],reverse=True )
sumB = sorted( [ B[_]-A[_]-C[_] for _ in range(n) ],reverse=True )
sumC = sorted( [ C[_]-B[_]-A[_] for _ in range(n) ],reverse=True )
aa,bb,cc = 0,0,0
ans = 0
for i in range(n):
    aa += sumA[i]; bb += sumB[i]; cc+= sumC[i]
    if aa>0:ans = max(ans,i+1)
    if bb>0:ans = max(ans,i+1)
    if cc>0:ans = max(ans,i+1)
if ans:
    print(ans)
else:
    print(-1)

试题五:平均

【题目描述】

        有一个长度为 n 的数组(n 是 10的倍数),每个数 ai 都是区间 [0,9][0,9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为 bi,他想更改若干个数的值使得这 1010 种数出现的次数相等(都等于 n10),请问代价和最少为多少。

【输入格式】

        输入的第一行包含一个正整数 n。

        接下来 n 行,第 i 行包含两个整数 ai,bi,用一个空格分隔。

【输出格式】

        输出一行包含一个正整数表示答案。

【数据范围】

        对于 20%20% 的评测用例,n≤1000
        对于所有评测用例,n≤105,0<bi≤2×105

【输入样例】

10
1 1
1 2
1 3
2 4
2 5
2 6
3 7
3 8
3 9
4 10

【输出样例】

27

【解题思路】

        简单题

【Python程序代码】

n = int(input())
num = [0]*12
dj = [[] for _ in range(10)]
for i in range(n):
    a,b = map(int,input().split())
    num[a]+=1
    dj[a].append(b)
avg = n//10
res = 0
for i in range(10):
    if num[i]>avg:
        t = dj[i]
        t.sort()
        for j in range(num[i]-avg):
            res += t[j]
print(res)

试题六:填充游戏

【题目描述】

        有一个长度为 n 的 01 串,其中有一些位置标记为 ?,这些位置上可以任意填充 0 或者 1,请问如何填充这些位置使得这个 01 串中出现互不重叠的 00 和 11 子串最多,输出子串个数。

【输入格式】

        输入一行包含一个字符串。

【输出格式】

        输出一行包含一个整数表示答案。

【数据范围】

        对于所有评测用例,1≤n≤106。

【输入样例】

1110?0

【输出样例】

2

【解题思路】

        如果连续的两个相等或有一个是?就+1

【Python程序代码】

s = input()
res,i = 0,0
while i<len(s):
    if i+1<len(s):
        if s[i]==s[i+1]  or (s[i]=='?' or s[i+1]=='?'):
            res += 1
            i += 1
    i += 1
print(res)

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学数学的懒哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值