基于Go的挑战程序设计竞赛的进化之路②

本文深入探讨了贪心算法的概念,并通过硬币问题、区间问题和字典序最小问题举例说明。在解决这些问题时,强调了贪心策略的选择,如在区间问题中选择结束时间排序来寻找正确答案。此外,文章还提到了其他贪心算法例题,如特定木板切割问题,通过排序和结合二叉树思想来优化解决方案。
摘要由CSDN通过智能技术生成

一往直前!贪心法

贪心法的概念:遵循某个规则,不断贪心地选取当前最优策略的算法设计方法。

硬币问题

请添加图片描述

凭直觉,可以得到一个规则,尽可能地多用面值大的硬币。

硬币问题是贪心算法中较为简单的例子。在搜索算法和动态规则算法是在多种策略中选取最优解;而贪心算法它是遵循某种规则,不断地选取当前最优策略。

package main

import "fmt"

var coin = []int{
   1, 5, 10, 50, 100, 500}
var coins = [6]int{
   }
var A int

func solve() {
   
	ans := 0
	for i := 5; i >= 0; i-- {
   
		t := min(A/coin[i], coins[i])
		A -= t * coins[i]
		ans++
	}
	fmt.Println(ans)
}

func min(a, b int) int {
   
	if a < b {
   
		return a
	}
	return b
}

func main() {
   
	fmt.Scanf("%d %d %d %d %d %d", &coins[0], &coins[1], &coins[2], &coins[3], &coins[4], &A)
	solve()
}

区间问题

请添加图片描述请添加图片描述

这个问题不像前面的硬币问题那么简单。最容易想到的一种贪心算法如下:

在可选的工作中,每次都选取开始时间最早的工作。但这种情况对于下列情况无法得到正确的答案。

请添加图片描述

除此之外,还会想到其他的想法:

(1)在可选的工作中,每次都选取结束时间最早的工作

(2)在可选的工作中,每次都选取用时最短的工作

(3)在可选的工作中,每次都选取与最少可选工作有重叠的工作**(我觉得这个想不到)**

请添加图片描述

对结束时间排序,然后选取完任务后记录结束时间,寻找下一个开始时间比记录的结束时间要晚的任务。

package main

import (
	"fmt"
	"sort"
)

const N = 100000

var s = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值