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 第四题 收集卡牌 思路 这题如果直接计算,因为不同的分类种数太多,枚举所有的分类情况是一个几乎不可能的复杂任务. 但不同摸牌次数,不同已摸出牌种类的子问题的答案之间,具 ...
 
随机推荐
- Mitmproxy 拦截、mock移动设备网络请求
			
转载于https://blog.csdn.net/countofdane/article/details/82055173 1. 安装 pip install mitmproxy 2. 启动 mi ...
 - 学习记录--C++多态性简答+编程题
			
#include<iostream> #include<string> //双目运算符:运算符作用域两个操作数 //定义一个复数类,重载"+",作为复数类的 ...
 - 网络基础-OSI七层模型
			
什么是OSI模型 OSI模型(或 Open Systems Interconnection Model开放系统互连模型)是网络中使用的绝对基础模型.这个关键模型提供了一个框架,规定所有联网设备将如何发 ...
 - Android笔记--外部存储空间
			
存储文件的操作 外部存储空间 私有存储空间和公共存储空间 外部存储空间分为私有+公有 保存文件到外部存储空间的相关代码操作: 私有空间: 公有空间: 记得增加权限(Android_Manifest.x ...
 - 关于IDEA发出基于APR的本地库加载失败错误的解决------->求解决!
			
问题描述 在没有使用Maven项目启动该Project时,Tomcat可以正常使用,但在这里会显示这样的错误: 这个错误,已经查了两天了,相关文件以及解决方法已经翻烂了,还没有解决,放出来集思广益一下 ...
 - 给生活加点惊喜,做创意生活的原型设计师丨编程挑战赛 x 选手分享
			
前言 做产品的大都跳过一个坑:我有了一个很好的产品创意,只差一个程序员帮我实现编程了. 事实上从产品创意到落地上线,中间需要经过非常复杂的过程,细节的逻辑流程才是难点,创意不能落地,并不值钱. 本文作 ...
 - 基于 Web SDK 实现视频通话场景 | 声网 SDK 教程
			
声网视频 SDK 被广泛应用于多种实时互动场景中,例如视频会议.视频通话.音视频社交.在线教育等.为了让刚刚接触声网 SDK 的开发者,可以更顺畅地实现基础的视频通话功能,我们基于声网 Web SDK ...
 - MySQL与Java常用数据类型的对应关系
			
一.字符串数据类型: MySQL类型名 大小 用途 对应Java类名 char 0-255 bytes 定长字符串 (姓名.性别.学号) String varchar 0-65535 bytes 变长 ...
 - es6数组相关操作
			
1. 获取两个数组中某个属性值相等的项 let a=[{name:1},{name:4},{name:3}] let b=[{name:5},{name:4},{name:2}] let index ...
 - 一遍博客带你上手Servlet
			
概念 Servlet其实就是Java提供的一门动态web资源开发技术.本质就是一个接口. 快速入门 创建web项目,导入servlet依赖坐标(注意依赖范围scope,是provided,只在编译和测 ...