6046 字
30 分钟
【ACM 算法题单】贪心算法相关问题

子串拼接贪心问题#

记录各种贪心排序

最大数构造问题#

题目链接

Problem Statement#

给定一组非负整数 nums ,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

Constraints#

  • 1nums.length1001 \leq nums.length \leq 100
  • 0nums[i]1090 \leq nums[i] \leq 10^9

Input#

输入包含两行:

  • 第一行包含一个整数 nn ,表示数组的长度。
  • 第二行包含 nn 个非负整数,表示数组 numsnums 中的元素。

nn

nums0nums1numsn1nums_0 \quad nums_1 \quad \ldots \quad nums_{n-1}

Output#

输出一个字符串,表示组成的最大的整数。

Sample Input 1#

2
10 2

Sample Output 1#

210

Sample Input 2#

5
3 30 34 5 9

Sample Output 2#

9534330

题目要点解析#

交叉组合排序

国王的奖赏游戏#

题目链接

题目要点解析#

交叉组合排序

所需的最少能量#

题目链接

Problem Statement#

给你一个任务数组 taskstasks ,其中 tasks[i]=[actuali,minimumi]tasks[i] = [actual_i, minimum_i]

  • actualiactual_i 是完成第 ii 个任务需要耗费的能量。
  • minimumiminimum_i 是开始第 ii 个任务前需要具备的最少能量。

比如,如果任务为 [10,12][10, 12] ,而你当前的能量为 1111 ,那么你不能开始该任务。如果你当前的能量为 1313 ,你可以开始该任务,且完成任务后剩余能量为 33

你可以按 任意顺序 完成任务。请你返回完成所有任务所需的 最少 初始能量。

Constraints#

  • 1tasks.length1051 \leq tasks.length \leq 10^5
  • 1actualiminimumi1041 \leq actual_i \leq minimum_i \leq 10^4

Input#

输入包含多行:

  • 第一行包含一个整数 nn ,表示任务的数量。
  • 接下来的 nn 行,每行包含两个整数,分别表示 actualiactual_iminimumiminimum_i

nn

actual1minimum1actual_1 \quad minimum_1

actual2minimum2actual_2 \quad minimum_2

\ldots

actualnminimumnactual_n \quad minimum_n

Output#

输出一个整数,表示完成所有任务所需的最少初始能量。

Sample Input 1#

5
1 3
2 4
10 11
10 12
8 9

Sample Output 1#

32

Sample Input 2#

3
1 7
2 8
3 9

Sample Output 2#

13

题目要点解析#

差值贪心排序

知识竞赛的筹备#

题目链接

Problem Statement#

部门要选两位员工参加知识竞赛。每个员工 ii 有两个能力值:推理能力 AiA_i 和阅读能力 BiB_i

如果选择第 ii 个人和第 jj 个人组队,他们在竞赛中表现出的能力如下:

  • 阅读能力X=Bi+Bj2X = \frac{B_i + B_j}{2}
  • 推理能力Y=Ai+Aj2Y = \frac{A_i + A_j}{2}

现在需要最大化他们表现较差一方面的能力,即让 min(X,Y)\min(X, Y) 尽可能大。请问这个最大值是多少?

Constraints#

  • 2n2×1052 \leq n \leq 2 \times 10^5
  • 1Ai,Bi1081 \leq A_i, B_i \leq 10^8

Input#

输入包含多行:

  • 第一行包含一个正整数 nn ,代表员工数。
  • 接下来的 nn 行,每行包含两个正整数 AiA_iBiB_i ,分别描述第 ii 个员工的推理能力和阅读能力。

nn

A1B1A_1 \quad B_1

A2B2A_2 \quad B_2

\ldots

AnBnA_n \quad B_n

Output#

仅输出一行,包含一个一位小数,表示 min(X,Y)\min(X, Y) 的最大值。

Sample Input#

3
2 2
3 1
1 3

Sample Output#

2.0

题目要点解析#

最小值贪心排序/差值绝对值贪心排序(最小值贪心需要证明正确性,可以对拍)

消灭的怪物数量#

题目链接

Problem Statement#

你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物的进攻。给你两个长度为 nn 的整数数组 distdistspeedspeed ,其中 dist[i]dist[i] 是第 ii 只怪物距离城市的初始距离,而 speed[i]speed[i] 是这只怪物每分钟向城市移动的速度。

你在游戏开始时(第 00 分钟)有一把武器,并已经蓄力完毕。你可以使用这把武器 瞬间 消灭一只怪物。但是,武器每次使用后都需要 11 分钟的时间进行再充电,在此期间你无法再次使用。

当怪物的距离 小于或等于 0 时,它就到达了城市,游戏结束。

请返回在输掉游戏前,你最多能消灭的怪物数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回 nn

Constraints#

  • n==dist.length==speed.lengthn == dist.length == speed.length
  • 1n1051 \leq n \leq 10^5
  • 1dist[i],speed[i]1051 \leq dist[i], speed[i] \leq 10^5

Input#

输入包含三行:

  • 第一行包含一个整数 nn ,表示怪物的数量。
  • 第二行包含 nn 个整数,表示数组 distdist 中的元素。
  • 第三行包含 nn 个整数,表示数组 speedspeed 中的元素。

nn

dist0dist1distn1dist_0 \quad dist_1 \quad \ldots \quad dist_{n-1}

speed0speed1speedn1speed_0 \quad speed_1 \quad \ldots \quad speed_{n-1}

Output#

输出一个整数,表示你最多能消灭的怪物数量。

Sample Input 1#

3
1 3 4
1 1 1

Sample Output 1#

3

Sample Input 2#

4
1 1 2 3
1 1 1 1

Sample Output 2#

1

题目要点解析#

性价比排序

最低的雇佣成本#

题目链接

Problem Statement#

nn 名工人。给定两个整数数组 qualityqualitywagewage ,其中 quality[i]quality[i] 表示第 ii 名工人的工作质量,wage[i]wage[i] 表示第 ii 名工人的最低期望工资。

现在我们想雇佣恰好 kk 名工人组成一个小组。在雇佣一组工人时,我们必须按照下述规则付费:

  • 对小组内的每一名工人,应当按其工作质量与小组内其他工人的工作质量的比例来付工资。
  • 小组内每名工人的工资至少应当是其最低期望工资。

请返回支付这 kk 名工人的最低成本。与实际答案误差在 10510^{-5} 以内的结果将被视为正确。

Constraints#

  • n==quality.length==wage.lengthn == quality.length == wage.length
  • 1kn1041 \leq k \leq n \leq 10^4
  • 1quality[i],wage[i]1041 \leq quality[i], wage[i] \leq 10^4

Input#

输入包含三行:

  • 第一行包含两个整数 nnkk
  • 第二行包含 nn 个整数,表示数组 qualityquality 中的元素。
  • 第三行包含 nn 个整数,表示数组 wagewage 中的元素。

nkn \quad k

quality0quality1qualityn1quality_0 \quad quality_1 \quad \ldots \quad quality_{n-1}

wage0wage1wagen1wage_0 \quad wage_1 \quad \ldots \quad wage_{n-1}

Output#

输出一个浮点数,表示最低总成本,保留五位小数。

Sample Input 1#

3 2
10 20 5
70 50 30

Sample Output 1#

105.00000

Sample Input 2#

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

Sample Output 2#

30.66667

题目要点解析#

性价比排序


两地调度贪心问题#

先全部选一个数组,然后再适当调整的贪心策略

两地的调度问题#

题目链接

Problem Statement#

公司计划面试 2n2n 名调度人员。给你一个数组 costscosts ,其中 costs[i]=[aCosti,bCosti]costs[i] = [aCost_i, bCost_i] ,表示第 ii 人飞往 AA 市的费用为 aCostiaCost_i ,飞往 BB 市的费用为 bCostibCost_i

返回将每个人飞往其中一座城市的最低总费用,要求每个城市都有 nn 人抵达。

Constraints#

  • 2n==costs.length2n == costs.length
  • 2costs.length1002 \leq costs.length \leq 100
  • costs.lengthcosts.length 是偶数
  • 1aCosti,bCosti10001 \leq aCost_i, bCost_i \leq 1000

Input#

输入包含多行:

  • 第一行包含一个整数 2n2n ,表示调度人员的总数。
  • 接下来的 2n2n 行,每行包含两个整数,分别表示 aCostiaCost_ibCostibCost_i

2n2n

aCost1bCost1aCost_1 \quad bCost_1

aCost2bCost2aCost_2 \quad bCost_2

\ldots

aCost2nbCost2naCost_{2n} \quad bCost_{2n}

Output#

输出一个整数,表示最低总费用。

Sample Input 1#

4
10 20
30 200
400 50
30 20

Sample Output 1#

110

Sample Input 2#

6
259 770
448 54
926 667
184 139
840 118
577 469

Sample Output 2#

1859

题目要点解析#

最大异或和问题#

题目链接

题目要点解析#


整数拆分贪心问题#

整数拆分动态规划是计算拆分的不同方法数,整数拆分贪心是使得最终的累乘积最大

竹子的最大价值#

题目链接

Problem Statement#

现需要将一根长为正整数 bamboo_len 的竹子砍为若干段,每段长度均为 正整数 。请返回每段竹子长度的 最大乘积 是多少。

由于答案可能很大,请将结果对 109+710^9 + 7 取模。

Constraints#

  • 2n10002 \leq n \leq 1000

Input#

输入仅包含一行:

nn

Output#

输出一个整数,表示最大乘积对 109+710^9 + 7 取模后的值。

Sample Input#

12

Sample Output#

81

题目要点解析#

拆分的最大乘积#

题目链接

Problem Statement#

给定一个正整数 nn ,将其拆分为 恰好 k 个 正整数,使得这 kk 个整数的乘积最大。

由于结果可能非常大,请将最终结果对 109+710^9 + 7 取模。

Constraints#

  • 1kn10121 \leq k \leq n \leq 10^{12}

Input#

输入仅包含一行:

nkn \quad k

Output#

输出一个整数,表示最大乘积对 109+710^9 + 7 取模后的值。

题目要点解析#


整数均摊贪心问题#

平均值最小总和#

题目链接

Problem Statement#

给定一个长度为 nn 的数组 arr 和一个正整数 kk 。现需要将 arr 划分为 kk 个集合,使得数组中的每个数字恰好进入一个集合。

请计算并返回这 kk 个集合各自平均值的累加和的最小值。每个集合的平均值计算方式为:该集合内所有元素的总和除以元素个数,结果 向下取整

Constraints#

  • 1n1051 \leq n \leq 10^5
  • 0arr[i]1050 \leq arr[i] \leq 10^5
  • 1kn1 \leq k \leq n

Input#

输入包含两行:

  • 第一行包含两个整数 nnkk ,分别表示数组长度和需要划分的集合数量。
  • 第二行包含 nn 个整数,表示数组 arrarr 中的元素。

nkn \quad k

arr1arr2arrnarr_1 \quad arr_2 \quad \ldots \quad arr_n

Output#

输出一个整数,表示所有集合平均值累加和的最小值。

题目要点解析#


小船过河贪心问题#

双人船渡河问题#

题目链接

Problem Statement#

在月黑风高的夜晚,nn 个人来到河边,准备借助仅有的一盏灯过河。由于河水湍急,每次最多只能有两人同时过河,且过河时必须携带灯。

已知每个人单独过河所需的时间,若两人同时过河,其所需时间取决于较慢的那个人。由于灯只有一盏,每次两人过河后,必须有一人将灯送回对岸,以便其他人过河。

请计算出全员过河所需的最短总时间。

Constraints#

  • 1n1051 \leq n \leq 10^5
  • 每个人的过河时间为不超过 10610^6 的正整数

Input#

输入包含多行:

  • 第一行包含一个整数 nn ,表示总人数。
  • 接下来 nn 行,每行包含一个整数,表示第 ii 个人过河所需的时间。

nn

t1t_1

t2t_2

\ldots

tnt_n

Output#

输出一个整数表示答案。

Sample Input#

4
1
2
5
10

Sample Output#

17

题目要点解析#


樵夫伐木贪心问题#

梦幻城的黄金树#

题目链接

Problem Statement#

在梦幻城市中有 nn 棵黄金树,每棵树每天都会结出金子。已知第 ii 棵树初始时已有 aia_i 个金币,且每天会新长出 bib_i 个金币。

JAVAMAN 准备在梦幻城市停留 mm 天,每天他只能选择砍掉一棵树并获得该树上所有的金币。需要注意的是,如果某一天他不砍树,那么在那之后的日子里他也无法再砍树。

请计算他在 mm 天内最多可以获得的金币总数。

Constraints#

  • 1T2001 \leq T \leq 200
  • 1mn2501 \leq m \leq n \leq 250
  • 1ai10001 \leq a_i \leq 1000
  • 1bi10001 \leq b_i \leq 1000

Input#

输入包含多个测试用例:

  • 第一行包含一个整数 TT ,表示测试用例的数量。

  • 对于每个测试用例:

    • 第一行包含两个整数 nnmm
    • 第二行包含 nn 个整数,表示每棵树初始的金币数 aia_i
    • 第三行包含 nn 个整数,表示每棵树每天增长的金币数 bib_i

TT

nmn \quad m

a1a2ana_1 \quad a_2 \quad \ldots \quad a_n

b1b2bnb_1 \quad b_2 \quad \ldots \quad b_n

Output#

输出一个整数,表示最多可以获得的金币总数。

Sample Input#

2
2 1
10 10
1 1
2 2
8 10
2 3

Sample Output#

10
21

题目要点解析#

最优的烹调方案#

题目链接

Problem Statement#

由于美食节将至,店主希望在 tt 时间内做出一些美味佳肴。现有 nn 件食材,每件食材有三个属性:aia_ibib_icic_i

如果在第 jj 时刻完成第 ii 件食材的烹调,可以获得的美味度为:

aij×bia_i - j \times b_i

每件食材烹调所需的时间为 cic_i 。请问如何安排烹调顺序,才能使获得的美味度总和最大。

Constraints#

  • 1n501 \leq n \leq 50
  • 1t1051 \leq t \leq 10^5
  • 1ai,bi,ci1051 \leq a_i, b_i, c_i \leq 10^5

Input#

输入包含四行:

  • 第一行包含两个整数 ttnn
  • 第二行包含 nn 个整数,表示 a1,a2,,ana_1, a_2, \ldots, a_n
  • 第三行包含 nn 个整数,表示 b1,b2,,bnb_1, b_2, \ldots, b_n
  • 第四行包含 nn 个整数,表示 c1,c2,,cnc_1, c_2, \ldots, c_n

tnt \quad n

a1a2ana_1 \quad a_2 \quad \ldots \quad a_n

b1b2bnb_1 \quad b_2 \quad \ldots \quad b_n

c1c2cnc_1 \quad c_2 \quad \ldots \quad c_n

Output#

输出一个整数,表示最大美味度总和。

Sample Input#

74 1
502
2
47

Sample Output#

408

题目要点解析#

我们一起来打CF#

题目链接

题目要点解析#


田忌赛马贪心问题#

解锁任务型贪心

复杂版田忌赛马#

题目链接

Problem Statement#

中国古代的历史上,齐王和田忌赛马的故事家喻户晓。齐王和田忌各有 NN 匹马,每匹马都有一个固定的速度值。

比赛规则如下:

  • 每一轮双方各出一匹马进行比赛,每匹马只能使用一次,直到 NN 匹马全部赛完。
  • 在一轮比赛中,如果田忌的马速度大于齐王的马,田忌获胜,得 200200 银币。
  • 如果田忌的马速度小于齐王的马,田忌失败,扣除 200200 银币。
  • 如果两匹马速度相等,则是平局,不奖励也不扣除银币。

田忌已知齐王出马的顺序。请你通过合理安排田忌出马的顺序,使得田忌最终能获得的银币总数最大。

Constraints#

  • 1N20001 \leq N \leq 2000
  • 马的速度不超过 10001000

Input#

输入包含三行:

  • 第一行包含一个整数 NN ,表示马的数量。
  • 第二行包含 NN 个整数,表示田忌的 NN 匹马的速度。
  • 第三行包含 NN 个整数,表示齐王的 NN 匹马的速度。

NN

a1a2aNa_1 \quad a_2 \quad \ldots \quad a_N

b1b2bNb_1 \quad b_2 \quad \ldots \quad b_N

Output#

输出一个整数,表示田忌能获得的最大银币数。

Sample Input 1#

3
92 83 71
95 87 74

Sample Output 1#

200

Sample Input 2#

2
20 20
20 20

Sample Output 2#

0

题目要点解析#

最新版田忌赛马#

题目链接

Problem Statement#

田忌与齐王再次进行赛马比赛。这次比赛规则有所不同,田忌需要通过合理安排马匹的对阵顺序,最大化自己的赏金收益。

田忌有 nn 匹马,第 ii 匹马的速度为 aia_i ;齐王有 mm 匹马,第 ii 匹马的速度为 bib_i 。由于田忌对自己和齐王的马匹了如指掌,他知道他和齐王的马都是按速度降序排列的。

每次比赛,田忌可以选择自己的一匹从未出战的马 ii 与齐王的一匹从未出战的马 jj 进行比赛:

  • 如果田忌的马速度严格大于齐王的马,田忌将获得 bjb_j 的赏金。
  • 如果田忌的马速度小于或等于齐王的马,田忌不会获得赏金。

你需要计算田忌能够获得的 最大 赏金总额。

Constraints#

  • 1n,m5×1051 \leq n, m \leq 5 \times 10^5
  • 1ai,bi1091 \leq a_i, b_i \leq 10^9
  • 数组 aabb 均已按 升序 排列

Input#

输入包含三行:

  • 第一行包含两个整数 nnmm ,分别表示田忌和齐王的马匹数量。
  • 第二行包含 nn 个整数,表示田忌各匹马的速度。
  • 第三行包含 mm 个整数,表示齐王各匹马的速度。

nmn \quad m

a1a2ana_1 \quad a_2 \quad \ldots \quad a_n

b1b2bmb_1 \quad b_2 \quad \ldots \quad b_m

Output#

输出一个整数,表示田忌能够获得的最大赏金总额。

Sample Input 1#

2 2
3 1
4 2

Sample Output 1#

2

Sample Input 2#

3 3
11 10 7
10 9 8

Sample Output 2#

19

Sample Input 3#

6 7
6 5 4 3 2 1
7 6 5 4 3 2 1

Sample Output 3#

15

题目要点解析#

加强版田忌赛马#

题目链接

Problem Statement#

田忌与齐王再次进行赛马比赛。这次比赛规则有所不同,田忌需要通过合理安排马匹的对阵顺序,最大化自己的赏金收益。

田忌有 nn 匹马,第 ii 匹马的速度为 aia_i ;齐王有 mm 匹马,第 ii 匹马的速度为 bib_i 。由于田忌对自己和齐王的马匹了如指掌,他知道他和齐王的马都是按速度降序排列的。

每次比赛,田忌可以选择自己的一匹从未出战的马 ii 与齐王的一匹从未出战的马 jj 进行比赛:

  • 如果田忌的马速度严格大于齐王的马,田忌将获得 bjb_j 的赏金。
  • 如果田忌的马速度小于或等于齐王的马,田忌不会获得赏金。

你需要计算田忌能够获得的 最大 赏金总额,以及有多少种 本质不同 的对阵方案可以获得该最大赏金总额。

两种对阵策略被称为本质不同的,当且仅当其中一个对阵策略中,存在某个田忌的马 ii 与齐王的马 jj 比赛,而另一个对阵策略中,田忌的马 ii 不与齐王的马 jj 比赛。

由于对阵策略种类数可能很多,对阵策略种类数只需要计算对 998244353998244353 取模后的答案,但是注意不要对最大赏金总额取模。

注意:你不需要最大化比赛数量,不进行任何比赛也是对阵策略的一种。

Constraints#

  • 1n,m5×1051 \leq n, m \leq 5 \times 10^5
  • 1ai,bi1091 \leq a_i, b_i \leq 10^9
  • 数组 aabb 均已按 降序 排列

Input#

输入包含三行:

  • 第一行包含两个整数 nnmm ,分别表示田忌和齐王的马匹数量。
  • 第二行包含 nn 个整数,表示田忌各匹马的速度。
  • 第三行包含 mm 个整数,表示齐王各匹马的速度。

nmn \quad m

a1a2ana_1 \quad a_2 \quad \ldots \quad a_n

b1b2bmb_1 \quad b_2 \quad \ldots \quad b_m

Output#

输出两个整数,第一个整数表示田忌能够获得的最大赏金总额,第二个整数表示有多少种本质不同的对阵策略可以获得该最大赏金总额,其中对阵策略种类数需要对 998244353998244353 取模。

Sample Input#

2 2
3 1
4 2

Sample Output#

2 2

题目要点解析#

大规模募资问题#

题目链接

Problem Statement#

假设 LeetCode 即将开始 IPO。为了以更高的价格将股票卖给风险投资公司,LeetCode 希望在 IPO 之前开展一些项目以增加其资本。由于资源有限,它只能在 IPO 之前完成最多 kk 个不同的项目。帮助 LeetCode 设计完成最多 kk 个指定的项目后,可获得的最大总资本。

给你 nn 个项目。对于每个项目 ii ,它都有一个纯利润 profits[i]profits[i] ,和启动该项目需要的最小资本 capital[i]capital[i]

最初,你的资本为 ww 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。

总而言之,从给定项目中选择最多 kk 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。

Constraints#

  • 1k1051 \leq k \leq 10^5
  • 0w1090 \leq w \leq 10^9
  • n==profits.lengthn == profits.length
  • n==capital.lengthn == capital.length
  • 1n1051 \leq n \leq 10^5
  • 0profits[i]1040 \leq profits[i] \leq 10^4
  • 0capital[i]1090 \leq capital[i] \leq 10^9

Input#

输入包含四行:

  • 第一行包含两个整数 nnkk ,分别表示项目的数量和最多可选择的项目数量。
  • 第二行包含一个整数 ww ,表示初始资本。
  • 第三行包含 nn 个整数,表示每个项目的纯利润 profitsprofits
  • 第四行包含 nn 个整数,表示每个项目启动所需的最小资本 capitalcapital

nkn \quad k

ww

profits1profits2profitsnprofits_1 \quad profits_2 \quad \ldots \quad profits_n

capital1capital2capitalncapital_1 \quad capital_2 \quad \ldots \quad capital_n

Output#

输出一个整数,表示最终可获得的最大总资本。

Sample Input 1#

3 2
0
1 2 3
0 1 1

Sample Output 1#

4

Sample Input 2#

3 3
0
1 2 3
0 1 2

Sample Output 2#

6

题目要点解析#

最低的加油次数#

题目链接

Problem Statement#

汽车从起点出发驶向目的地,该目的地位于距起点 target 英里处。

沿途有若干个加油站,每个 station[i] 代表一个加油站,它位于距起点 station[i][0]station[i][0] 英里处,并且有 station[i][1]station[i][1] 升汽油。

假设汽车离起点距离无限远且油箱容量无限大,初始时燃料为 startFuel 升。它每行驶 11 英里就会用掉 11 升汽油。当汽车到达一个加油站时,它可能停下来加油,将加油站所有的汽油都装入油箱。

为了到达目的地,汽车最少需要加油多少次?如果无法到达目的地,则返回 1-1

注意:如果汽车到达目的地时剩余燃料为 00 ,它仍然被视为到达了目的地。如果它到达加油站时剩余燃料为 00 ,它仍然可以在该加油站加油。

Constraints#

  • 1target,startFuel1091 \leq target, startFuel \leq 10^9
  • 0stations.length5000 \leq stations.length \leq 500
  • 0<station[i][0]<station[i+1][0]<target0 < station[i][0] < station[i+1][0] < target
  • 1station[i][1]1091 \leq station[i][1] \leq 10^9

Input#

输入包含多行:

  • 第一行包含两个整数 targettargetstartFuelstartFuel ,分别表示目的地的距离和初始燃料量。
  • 第二行包含一个整数 NN ,表示加油站的数量。
  • 接下来 NN 行,每行包含两个整数 distidist_ifuelifuel_i ,表示第 ii 个加油站距离起点的距离和拥有的燃料量。

targetstartFueltarget \quad startFuel

NN

dist1fuel1dist_1 \quad fuel_1

dist2fuel2dist_2 \quad fuel_2

\ldots

distNfuelNdist_N \quad fuel_N

Output#

输出一个整数,表示最少需要的加油次数。如果无法到达,输出 -1

Sample Input 1#

100 1
1
10 100

Sample Output 1#

-1

Sample Input 2#

100 10
4
10 60
20 30
30 30
60 40

Sample Output 2#

2

题目要点解析#


数组同化贪心问题#

中位数贪心相关

中位数贪心及其证明

使数组元素相等#

题目链接

题目要点解析#

构造模交替数组#

题目链接

题目要点解析#


建筑抢修贪心问题#

经典反悔贪心之一

建筑抢修小游戏#

题目链接

Problem Statement#

小修正在赶往一些建筑进行抢修。由于建筑物的受损程度不同,抢修每个建筑所需的时间以及该建筑能够支撑的最晚抢修时间也各不相同。

具体而言,第 ii 个建筑抢修需要花费的时间为 T1T_1 ,而它在 T2T_2 时刻之后就会倒塌。如果小修决定抢修某个建筑,他必须在 该建筑倒塌之前 完成抢修。

小修从 00 时刻出发,每次只能抢修一个建筑。请你帮助小修进行规划,使得他能够抢修的建筑数量最多。

Constraints#

  • 1N1.5×1051 \leq N \leq 1.5 \times 10^5
  • 1T1T2<2311 \leq T_1 \leq T_2 < 2^{31}

Input#

输入包含多行:

  • 第一行包含一个整数 NN ,表示建筑的数量。
  • 接下来 NN 行,每行包含两个整数 T1T_1T2T_2 ,分别表示抢修该建筑需要的时间和该建筑的最晚倒塌时间。

NN

T1,1T2,1T_{1,1} \quad T_{2,1}

T1,2T2,2T_{1,2} \quad T_{2,2}

\ldots

T1,NT2,NT_{1,N} \quad T_{2,N}

Output#

输出一个整数,表示最多可以抢修的建筑数量。

Sample Input 1#

4
100 200
200 1300
1000 1250
2000 3200

Sample Output 1#

3

题目要点解析#


城市绿化贪心问题#

复杂的种树问题#

题目链接

Problem Statement#

在一条环形街道旁共有 NN 棵树。为了美化环境,需要在其中选择 MM 棵树种上装饰物。

种树需要遵守以下规则:

  • 任意两棵相邻的树不能同时被种上装饰物。
  • 由于是环形街道,第 11 棵树与第 NN 棵树被视为相邻。
  • 每棵树都有一个美观度 aia_i ,你的目标是使得选出的 MM 棵树的总美观度最大。

如果无法按照规则种下 MM 棵树,则输出 Error!

Constraints#

  • 1N2×1051 \leq N \leq 2 \times 10^5
  • 1MN1 \leq M \leq N
  • 1000ai1000-1000 \leq a_i \leq 1000

Input#

输入包含两行:

  • 第一行包含两个整数 NNMM ,分别表示树的总数和需要种装饰物的树的数量。
  • 第二行包含 NN 个整数,表示每棵树的美观度。

NMN \quad M

a1a2aNa_1 \quad a_2 \quad \ldots \quad a_N

Output#

输出一个整数,表示最大总美观度。如果方案不存在,输出 Error!

Sample Input 1#

7 3
1 2 3 4 5 6 7

Sample Output 1#

15

Sample Input 2#

7 4
1 2 3 4 5 6 7

Sample Output 2#

Error!

题目要点解析#


参考文献列表#

  1. 【CSDN 博客】贪心算法之区间问题

  2. 【Luogu 博客】反悔贪心的再理解

  3. 【wshcl】反悔贪心相关题目收集

【ACM 算法题单】贪心算法相关问题
https://xingguang641.com/posts/acm/acm-type/heap-problems/greedy-algorithm/
作者
星光
发布于
2026-03-25
许可协议
CC BY-NC-SA 4.0