2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a和b乐队参演,花费为c。每一个乐队可能在多个项目里都出现了,但是只能被挑一次。nums是可以挑选的项目数量,所以一定会有nums
2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a和b乐队参演,花费为c。每一个乐队可能在多个项目里都出现了,但是只能被挑一次。nums是可以挑选的项目数量,所以一定会有nums2只乐队被挑选出来。返回一共挑nums轮(也就意味着一定请到所有的乐队),最少花费是多少。如果怎么都无法在nums轮请到nums2只乐队且每只乐队只能被挑一次,返回-1。nums<9,programs长度小于500,每组测试乐队的全部数量一定是nums2,且标号一定是0 ~ nums2-1。
福大大 答案2021-09-08:
代码有点问题。时间紧,这道题不管了。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
"sort"
)
func main() {
programs := [][]int{{0, 1, 3}, {0, 1, 4}}
nums := 1
ret := minCost(programs, nums)
fmt.Println(ret)
}
// 每一个项目都有三个数,[a,b,c]表示这个项目a和b乐队参演,花费为c
// 每一个乐队可能在多个项目里都出现了,但是只能挑一次
// nums是可以挑选的项目数量,所以一定会有nums*2只乐队被挑选出来
// 乐队的全部数量一定是nums*2,且标号一定是0 ~ nums*2-1
// 返回一共挑nums轮(也就意味着一定请到所有的乐队),最少花费是多少?
func minCost(programs [][]int, nums int) int {
if nums == 0 || len(programs) == 0 {
return 0
}
size := clean(programs)
map1 := init0(1 << (nums << 1))
var map2 []int
if (nums & 1) == 0 {
// nums = 8 , 4
f(programs, size, 0, 0, 0, nums>>1, &map1)
map2 = map1
} else {
// nums == 7 4 -> map1 3 -> map2
f(programs, size, 0, 0, 0, nums>>1, &map1)
map2 = init0(1 << (nums << 1))
f(programs, size, 0, 0, 0, nums-(nums>>1), &map2)
}
// 16 mask : 0..00 1111.1111(16个)
// 12 mask : 0..00 1111.1111(12个)
mask := (1 << (nums << 1)) - 1
ans := math.MaxInt64
for i := 0; i < len(map1); i++ {
if map1[i] != math.MaxInt64 && map2[mask&(^i)] != math.MaxInt64 {
ans = getMin(ans, map1[i]+map2[mask&(^i)])
}
}
return twoSelectOne(ans == math.MaxInt64, -1, ans)
}
func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
func twoSelectOne(c bool, a int, b int) int {
if c {
return a
} else {
return b
}
}
// [
// [9, 1, 100]
// [2, 9 , 50]
// ...
// ]
func clean(programs [][]int) int {
x := 0
y := 0
for _, p := range programs {
x = getMin(p[0], p[1])
y = getMax(p[0], p[1])
p[0] = x
p[1] = y
}
//Arrays.sort(programs, (a, b) -> a[0] != b[0] ? (a[0] - b[0]) : (a[1] != b[1] ? (a[1] - b[1]) : (a[2] - b[2])));
sort.Slice(programs, func(i, j int) bool {
//a := programs[i]
//b := programs[j]
if programs[i][0] != programs[j][0] {
return programs[i][0] > programs[j][0]
} else {
if programs[i][1] != programs[j][1] {
return programs[i][1] > programs[j][1]
} else {
return programs[i][2] > programs[j][2]
}
}
})
x = programs[0][0]
y = programs[0][1]
n := len(programs)
// (0, 1, ? )
for i := 1; i < n; i++ {
if programs[i][0] == x && programs[i][1] == y {
programs[i] = nil
} else {
x = programs[i][0]
y = programs[i][1]
}
}
size := 1
for i := 1; i < n; i++ {
if programs[i] != nil {
programs[size] = programs[i]
size++
}
}
// programs[0...size-1]
return size
}
func init0(size int) []int {
arr := make([]int, size)
for i := 0; i < size; i++ {
arr[i] = math.MaxInt64
}
return arr
}
func f(programs [][]int, size int, index int, status int, cost int, rest int, map0 *[]int) {
if rest == 0 {
(*map0)[status] = getMin((*map0)[status], cost)
} else {
if index != size {
f(programs, size, index+1, status, cost, rest, map0)
pick := 0 | (1 << programs[index][0]) | (1 << programs[index][1])
if (pick & status) == 0 {
f(programs, size, index+1, status|pick, cost+programs[index][2], rest-1, map0)
}
}
}
}
执行结果如下:
2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a和b乐队参演,花费为c。每一个乐队可能在多个项目里都出现了,但是只能被挑一次。nums是可以挑选的项目数量,所以一定会有nums的更多相关文章
- JAVA_新建一个方法并且求三个数中的最大值
package wac.wev.as;//新建一个方法在求最大值import java.util.Scanner; public class MaxLian {public static void m ...
- express + mongodb 搭建一个简易网站 (三)
express + mongodb 搭建一个简易网站 (三) 前面已经实现了基本的网站功能,现在我们就开始开搞一个完整的网站,现在整个网站的UI就是下面的这个样子. 我们网站的样子就照着这个来吧. 1 ...
- [项目实施失败讨论Case] “凭心而论,在这家公司很敬业的工作了3年多,老板最后给我下的评语,大家都看看吧,千万别和我走同一条路!”(摘自csdn)
[Case] “凭心而论,在这家公司很敬业的工作了3年多,老板最后给我下的评语,大家都看看吧,千万别和我走同一条路!”(摘自csdn) 原文:http://community.csdn.net/Exp ...
- 当try和finally里都有return时,会忽略try的return,而使用finally的return
今天去逛论坛 时发现了一个很有趣的问题: 谁能给我我解释一下这段程序的结果为什么是:2.而不是:3 代码如下: class Test { public int aaa() { int x = 1; t ...
- web前端工程师在移动互联网时代里的地位问题 为啥C/S系统在PC端没有流行起来,却在移动互联网下流行了起来 为啥移动端的浏览器在很多应用里都是靠边站,人们更加倾向于先麻烦自己一下,下载安装个客户端APP
web前端工程师在移动互联网时代里的地位问题 支付宝十周年推出了一个新产品:支付宝的十年账单,我也赶个时髦查看了一下我的支付宝十年账单,哎,感慨自己真是太屌丝了,不过这只是说明我使用淘宝少了,当我大规 ...
- F - Goldbach`s Conjecture 对一个大于2的偶数n,找有多少种方法使两个素数的和为n;保证素数a<=b; a+b==n; a,b都为素数。
/** 题目:F - Goldbach`s Conjecture 链接:https://vjudge.net/contest/154246#problem/F 题意:对一个大于2的偶数n,找有多少种方 ...
- 我的第一个netcore2.2 api项目搭建(三)续
上一章快速陈述了自定义验证功能添加的过程,我的第一个netcore2.2 api项目搭建(三) 但是并没有真正的去实现,这一章将要实现验证功能的添加. 这一章实现目标三:jwt认证授权添加 在netc ...
- 2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)
2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP) https://www.luogu.com.cn/problem/P1848 题意: 当农夫约翰闲 ...
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
- 2021.09 ccf csp 第四题 收集卡牌
2021.09 ccf csp 第四题 收集卡牌 思路 这题如果直接计算,因为不同的分类种数太多,枚举所有的分类情况是一个几乎不可能的复杂任务. 但不同摸牌次数,不同已摸出牌种类的子问题的答案之间,具 ...
随机推荐
- celery介绍安装以及基本使用步骤
目录 一.关于celery 二.celery架构的构成 1 任务中间件 Broker, 2 任务执行单元 worker 3 结果存储 backend 三.celery的应用场景 1. 异步执行:解决耗 ...
- 深入理解 Python 虚拟机:浮点数(float)的实现原理及源码剖析
深入理解 Python 虚拟机:浮点数(float)的实现原理及源码剖析 在本篇文章当中主要分析在 cpython 虚拟机当中 float 类型的实现原理以及与他相关的一些源代码. Float 数据结 ...
- Python学习笔记--高阶技巧
闭包(避免全局变量被修改的风险) 函数的嵌套的利用 若是只是调用到外部函数的值,只需要用到函数的嵌套,具体实现如下: 若是要对外部函数的值进行修改,需要用到nonlocal关键字,具体实现如下: at ...
- VMware虚拟机扩容--保姆级教学
由于项目逐步的完善,需要搭建的中间件,软件越来越多,导致以前虚拟机配置20G的内存不够用了,又不想重新创建新的虚拟机,退而求更精,选择扩容. 1.外部先进入虚拟机设置,将磁盘先扩展,具体提示如下图所示 ...
- 同步协程的必备工具: WaitGroup
1. 简介 本文将介绍 Go 语言中的 WaitGroup 并发原语,包括 WaitGroup 的基本使用方法.实现原理.使用注意事项以及常见的使用方式.能够更好地理解和应用 WaitGroup 来协 ...
- STM32F407 学习 (0) 各种外设功能 (中)
十.高级定时器 1.重复计数器 如果我们设置重复计数器寄存器 RCR 的值为 N,那么更新事件将在定时器发生 N+1 次上溢或下溢时发生.重复计数器的特性,在控制生成 PWM 信号时很有用. 2. ...
- Charlotte Holmes series
Charlotte Holmes Novel The charactors are adorable. Jamie and Charlotte are a very cute couple. More ...
- Kubernetes(k8s)实现IPv4/IPv6网络双栈
背景 如今IPv4IP地址已经使用完毕,未来全球会以IPv6地址为中心,会大力发展IPv6网络环境,由于IPv6可以实现给任何一个设备分配到公网IP,所以资源是非常丰富的. 配置hosts [root ...
- [Java SE/Junit] 基于Java的单元测试框架Mockito
Mockito 是一个模拟测试框架,主要功能是在单元测试中模拟类/对象的行为. 1 为什么要使用Mockito? Mock可以理解为创建一个虚假的对象,或者说模拟出一个对象.在测试环境中用来替换掉真实 ...
- Unity学习笔记01 —— 编辑器
场景Scene 基本操作 按下鼠标滚轮拖动场景,滑动滚轮缩放场景. 鼠标右键旋转场景,点击""后,通过左键移动场景. 点击右键同时按下W/S/A/D/Q/E键可实现场景漫游. 在S ...