当前位置: 首页 > news >正文

【刷题2025】贪心算法+KMP算法+暴力枚举+扫描树线段树+LFU缓存

1.贪心算法

(1)火锅

题目描述
入职后,导师会请你吃饭,你选择了火锅。 火锅里会在不同时间下很多菜. 不同食材要煮不同的时间,才能变得刚好合适。 你希望吃到最多的刚好合适的菜,但你的手速不够快,用 m 代表手速,每次下手捞菜后至少要过 m 秒才能再捞(每次只能捞一个)。 那么用最合理的策略,最多能吃到多少刚好合适的菜?

输入描述
第一行两个整数 n,m,其中 n 代表往锅里下的菜的个数,m 代表手速。 (1<n,m< 1000)
接下来有 n 行,每行有两个数 x,y 代表第 x 秒下的菜过 y 秒才能变得刚好合适。
(1<x,y< 1000)。

输出描述
输出一个整数代表用最合理的策略,最多能吃到刚好合适的菜的数量。

用例

# 输入
3 2
1 2
2 1
3 2# 输出
2# 说明
往锅里下的菜的个数3,手速2;
第1秒的时候下入菜品1,2秒后熟了;
第2秒的时候下入菜品2,1秒后熟了;
第3秒的时候下入菜品3,2秒后熟了;
第一种菜品和第二种菜品只能吃到一种,第三种菜品可以吃到;
输出 2
n, m = list(map(int, input().split()))
food = []
for _ in range(n):food.append(list(map(int, input().split())))def solve():foodtime = []for f in food:foodtime.append(sum(f))foodtime.sort()ans = 0pre = -mfor i in range(n):if foodtime[i] - pre >= m:ans += 1pre = foodtime[i]return ansprint(solve())

(2)最佳对手

题目描述

游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大,对于双方游戏体验都不会太好。给定 n 个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距 d 内,则可以匹配.

要求在匹配队伍最多的情况下匹配出的各组实力差距的总和最小。

输入描述

第一行,n,d。队伍个数 n。允许的最大实力差距 d。2<=n <=50,0<=d<=100

第二行,n 个队伍的实力值空格分割。

0<=各队伍实力值<=100

输出描述

匹配后,各组对战的实力差值的总和。若没有队伍可以匹配,则输出-1

解题思路

首先将value数组进行分段,当前后两支队伍实力差超过最大值时分为两个segment。接下来根据每个segment中的队伍实力两两求得实力差,由于相邻实力差会用到同一支队伍,因此为了确保配对队伍最多隔一个实力差进行选取。若实力差数组长度为奇数,则只有一种选法。若实力差数组长度为偶数,说明有奇数支队伍,则必然有一支队伍不必选,设置abandon标志,当abandon=False时说明还可以跳过一个实力差(即跳过两个);若实力差长度为奇数,则说明跳过机会已经用掉了,只能选择当前实力差。

# 输入
6 30
81 87 47 59 81 18# 输出
57# 说明
18与47配对,实力差距29
59与81配对,实力差距22
81与87配对,实力差距6
总实力差距29+22+6=57# 输入
6 20
81 87 47 59 81 18# 输出
12# 说明
最多能匹配成功4支队伍。
47与59配对,实力差距12
81与81配对,实力差距0
总实力差距12+0=12# 输入
4 10
40 51 62 73# 输出
-1# 说明
实力差距都在10以上,没有队伍可以匹配成功
n, maxdiff = list(map(int, input().split()))
value = list(map(int, input().split()))
# print(value)def recursive(num, index, abandon, ans):if index >= len(num):return ansminans = float("inf")# 一跳minans = min(minans, recursive(num, index+2, abandon, ans+num[index]))# 两跳if not abandon:minans = min(minans, recursive(num, index+1, True, ans))return minansdef solve():value.sort()segments = []segment = []for i in range(1, n):diff = value[i]-value[i-1]if diff <= maxdiff:segment.append(diff)elif len(segment) > 0:segments.append(segment)segment = []if len(segment) > 0:segments.append(segment)if segments == []:return -1else:return sum(map(lambda lst:recursive(lst, 0, len(lst)%2==1, 0), segments))print(solve())

(3)数字序列比大小

题目描述

A,B两个人玩一个数字比大小的游戏,在游戏前,两个人会拿到相同长度的两个数字序列,两个数字序列是不完全相同的,且其中的数字是随机的。
A,B各自从数字序列中挑选出一个数字进行大小比较,赢的人得1分,输的人扣1分,相等则各自的分数不变。用过的数字需要丢弃。
求A可能赢B的最大分数

输入描述
输入数据的第1个数字表示数字序列的长度N,后面紧跟着两个长度为N的数字序列,

输出描述
A可能嬴B的最大分数

备注
1.这里要求计算A可能赢B的最大分数,不妨假设,A知道B的数字序列,且总是B先挑选数字并明示
2.可以采用贪心策略,能赢的一定要赢,要输的尽量减少损失。

示例
输入
3
4 8 10
3 6 4
输出
3
说明
输入数据第1个数字表示数字序列长度为3,后面紧跟着两个长度为3的数字序列。
序列A:4 8 10
序列B:3 6 4
A可以赢的最大分数是3。获得该分数的比大小过程可以是:
1)A: 4 B:3
2)A: 8 B:6
3)A:10 B:4

n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))a.sort()
b.sort()def solve(a, b, i, j, score):if i == n or j == n:return scoreif a[i] > b[j]:maxscore = solve(a, b, i+1, j+1, score+1)elif a[i] == b[j]:maxscore = max(solve(a, b, i+1, j+1, score), solve(a, b, i+1, j, score-1))else:maxscore = max(solve(a, b, i+1, j+1, score-1), solve(a, b, i+1, j, score-1))return maxscoreprint(solve(a, b, 0, 0, 0))
# 双指针# 输入获取
n = int(input())
a = list(map(int, input().split()))  # 田忌的马速度数组
b = list(map(int, input().split()))  # 齐王的马速度数组# 算法入口
def getResult():a.sort()b.sort()la = 0  # 指向田忌最慢的马ra = n - 1  # 指向田忌最快的马lb = 0  # 指向齐王最慢的马rb = n - 1  # 指向齐王最快的马ans = 0  # 记录田忌获得银币数while la <= ra:if a[ra] > b[rb]:#  田忌最快的马 比 齐王最快的马要快, 则直接比ans += 1ra -= 1rb -= 1elif a[ra] < b[rb]:# 田忌最快的马 比 齐王最快的马要慢, 则结果肯定输, 为了保留田忌最快的马, 我们应该用田忌最慢的马去消耗掉齐王最快的马ans -= 1la += 1rb -= 1else:# 田忌最快的马 和 齐王最快的 速度相同, 此时如果平局的话,则会让田忌损失最快的马,因此我们应该找到田忌最慢的马, 即田忌必输的马来消耗掉齐王最快的马if a[la] > b[lb]:# 如果田忌最慢的马 比 齐王最慢的马 快, 则此时田忌最慢的马不是必输的马ans += 1la += 1lb += 1else:# 如果田忌最慢的马速度 <= 齐王最慢的马速度, 此时应该让田忌最慢的马 去消耗  齐王最快的马# 如果齐王最快的马速度 > 田忌最慢的马速度,则田忌失去银币# 如果齐王最快的马速度 == 田忌最慢的马速度,则田忌不失去银币if b[rb] > a[la]:ans -= 1la += 1rb -= 1return ans# 算法调用
print(getResult())

(4)贪心歌手

题目描述
一个歌手准备从A城去B城参加演出。按照合同,他必须在 T 天内赶到,歌手途经 N 座城市,歌手不能往回走,每两座城市之间需要的天数都可以提前获知。歌手在每座城市都可以在路边卖唱赚钱。经过调研,歌手提前获知了每座城市卖唱的收入预期: 如果在一座城市第一天卖唱可以赚M,后续每天的收入会减少D(第二天赚的钱是 M - D,第三天是 M - 2D …)。如果收入减少到 0 就不会再少了。歌手到达后的第二天才能开始卖唱。如果今天卖过唱,第二天才能出发。贪心的歌手最多可以赚多少钱?

输入描述
第一行两个数字 T 和 N,中间用空格隔开。T 代表总天数,0 < T < 1000N 代表路上经过 N 座城市,0 < N < 100
第二行 N+1 个数字,中间用空格隔开。代表每两座城市之间耗费的时间。其总和 ≤ T。
接下来 N 行,每行两个数字 M 和 D,中间用空格隔开。代表每个城市的输入预期。0 < M < 1000,0 < D < 100

输出描述
一个数字。代表歌手最多可以赚多少钱。以回车结束。

用例

# 输入
10 2
1 1 2
120 20
90 10# 输出
540# 说明
总共10天,路上经过2座城市。
路上共花 1+1+2=4 天
剩余6天最好的计划是在第一座城市待3天,在第二座城市待3天。
在第一座城市赚的钱:120 + 100 + 80 = 300
在第二座城市赚的钱:90 + 80 + 70 = 240
一共 300 + 240 = 540。
T, N = list(map(int, input().split()))  # T天内,N座城市
Dis = list(map(int, input().split()))  # 两座城市之间耗费的时间
p

相关文章:

  • Hanks 液环境镍钛合金应力腐蚀试验机
  • Java练习——day1(反射)
  • 【嵌入式八股4】C++:引用、模板、哈希表与 I/O
  • LeetCode算法题(Go语言实现)_47
  • 操作系统导论——第22章 超越物理内存:策略
  • 基于x86/RK3568电力新能源智能变电站一体化装置
  • CMS 垃圾收集器深度解析
  • 《计算机视觉度量:从特征描述到深度学习》—生成式人工智能在工业检测的应用
  • ceph scrub 导致业务问题优化
  • 【Dify(v1.2) 核心源码深入解析】Agent 模块
  • 深入讲解 CSS 选择器权重及实战
  • 【刷题2025】单指针双指针+滑动窗口+二分法三分法+区间问题
  • 如何一键检查网页里的失效链接和废弃域名?
  • 【加密算法】SM2密钥生成与转换详解:从原理到代码实现
  • ecovadis分为哪些类别,要进行ecovadis认证有什么要求
  • 榕壹云场馆预定系统:基于ThinkPHP+MySQL+UniApp打造的全能运动馆智慧运营解决方案
  • 解锁Grok-3的极致潜能:高阶应用与创新实践
  • 多模态大模型文字识别 vs OCR识别模型
  • 【Python进阶】断言(assert)的十大核心应用场景解析
  • RelativeLayout(相对布局)
  • 国际乒联祝贺王励勤当选中国乒协主席并向刘国梁致谢
  • 金湘军辞去山西省省长职务
  • 2025年一季度上海市国民经济运行情况
  • 中华人民共和国和阿塞拜疆共和国关于建立全面战略伙伴关系的联合声明
  • 印控克什米尔发生恐袭事件,外交部:中方反对一切形式的恐怖主义
  • 港澳航天员最早2026年飞天