IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021-09-08:每一个项目都有三个数,[abc]表示这个项目a和b乐队参演,花费为c。每一个乐队可能在多个项目里都出现了,但是只能被挑一次。nums是可以挑选的项目数量,所以一定会有nums -> 正文阅读

[C++知识库]2021-09-08:每一个项目都有三个数,[abc]表示这个项目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)
            }
        }
    }
}

执行结果如下:
图片


左神java代码

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:33:43  更:2021-09-09 11:34:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:14:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码