首页 > 其他分享 >2023-12-27:用go语言,店铺数量n,编号1~n, 人的数量m,编号1~m, 每个人有自己投票的店铺p,和改投1号店的报价x。 返回想让1号店铺成为人气最高的店,至少花多少钱? 1 <= p,

2023-12-27:用go语言,店铺数量n,编号1~n, 人的数量m,编号1~m, 每个人有自己投票的店铺p,和改投1号店的报价x。 返回想让1号店铺成为人气最高的店,至少花多少钱? 1 <= p,

时间:2023-12-27 16:11:56浏览次数:50  
标签:arr return int fmt cnts 编号 1号店 店铺

2023-12-27:用go语言,店铺数量n,编号1~n,

人的数量m,编号1~m,

每个人有自己投票的店铺p,和改投1号店的报价x。

返回想让1号店铺成为人气最高的店,至少花多少钱?

1 <= p,n,m <= 3000,

1 <= x <= 10^9。

1号店铺贿赂问题。来自华为OD。

答案2023-12-27:

来自左程云

灵捷3.5

大体步骤如下:

minCost1算法步骤:

1.统计每个店铺对应的人数,存储在cnts数组中。

2.判断是否需要改变投票,若不需要改变,则返回0。

3.调用process函数,传入arr数组、当前位置i、店铺数量n和change数组。

4.在process函数中,判断是否遍历完所有人的投票,若是则进行以下操作:

4.a. 统计各店铺的人数,并计算贿赂费用sum。

4.b. 检查是否存在店铺的人数超过1号店铺的人数,若存在则返回一个很大的值(math.MaxInt64),否则返回贿赂费用sum。

5.否则,继续调用process函数,分别传入改变当前位置i的投票和不改变的投票,并比较两种情况的最小贿赂费用。

minCost2算法步骤:

1.统计每个店铺对应的人数,存储在cnts数组中。

2.判断是否需要改变投票,若不需要改变,则返回0。

3.对arr数组按照报价x进行升序排序。

4.创建一个二维数组shops,用于存储每个店铺对应的人的索引。

5.遍历arr数组,将每个人的索引添加到shops数组对应店铺的列表中。

6.创建一个表示人是否被使用的布尔数组used,并初始化为false。

7.初始化一个很大的值ans为math.MaxInt64。

8.从cnts[1]+1开始,遍历可能的最小贿赂人数i:

8.a.调用函数f,传入arr数组、店铺数量n、已贿赂人数already、必须贿赂人数must、shops数组和used数组。

8.b.若返回值money不等于-1,则更新ans为min(ans, money)。

9.返回最小贿赂费用ans。

总的时间复杂度和空间复杂度:

  • minCost1算法的时间复杂度为O(2^m),空间复杂度为O(m)。

  • minCost2算法的时间复杂度为O(mnlog(m)),空间复杂度为O(m)。

go完整代码如下:

package main

import (
	"fmt"
	"math"
	"math/rand"
	"sort"
	"time"
)

func minCost1(n, m int, arr [][]int) int {
	cnts := make([]int, n+1)
	for _, p := range arr {
		cnts[p[0]]++
	}
	needChange := false
	for i := 2; i <= n; i++ {
		if cnts[i] >= cnts[1] {
			needChange = true
			break
		}
	}
	if !needChange {
		return 0
	}
	return process(arr, 0, n, make([]bool, m))
}

func process(arr [][]int, i, n int, change []bool) int {
	if i == len(arr) {
		cnts := make([]int, n+1)
		sum := 0
		for j := 0; j < len(arr); j++ {
			if change[j] {
				cnts[1]++
				sum += arr[j][1]
			} else {
				cnts[arr[j][0]]++
			}
		}
		ok := true
		for j := 2; j <= n; j++ {
			if cnts[j] >= cnts[1] {
				ok = false
				break
			}
		}
		if !ok {
			return math.MaxInt64
		} else {
			return sum
		}
	} else {
		p1 := math.MaxInt64
		if arr[i][0] != 1 {
			change[i] = true
			p1 = process(arr, i+1, n, change)
			change[i] = false
		}
		p2 := process(arr, i+1, n, change)
		return min(p1, p2)
	}
}

func minCost2(n, m int, arr [][]int) int {
	cnts := make([]int, n+1)
	for _, p := range arr {
		cnts[p[0]]++
	}
	needChange := false
	for i := 2; i <= n; i++ {
		if cnts[i] >= cnts[1] {
			needChange = true
			break
		}
	}
	if !needChange {
		return 0
	}
	sort.Slice(arr, func(i, j int) bool {
		return arr[i][1] < arr[j][1]
	})
	shops := make([][]int, n+1)
	for i := 0; i <= n; i++ {
		shops[i] = []int{}
	}
	for i := 0; i < m; i++ {
		shops[arr[i][0]] = append(shops[arr[i][0]], i)
	}
	used := make([]bool, m)
	ans := math.MaxInt64
	for i := cnts[1] + 1; i <= m; i++ {
		money := f(arr, n, cnts[1], i, shops, used)
		if money != -1 {
			ans = min(ans, money)
		}
	}
	return ans
}

func f(arr [][]int, n, already, must int, shops [][]int, used []bool) int {
	for i := 0; i < len(used); i++ {
		used[i] = false
	}
	sum := int(0)
	for i := 2; i <= n; i++ {
		needChange := max(0, len(shops[i])-must+1)
		for j := 0; j < needChange; j++ {
			people := shops[i][j]
			sum += int(arr[people][1])
			used[people] = true
		}
		already += needChange
		if already > must {
			return -1
		}
	}
	for i, j := 0, 0; already+j < must; i++ {
		if arr[i][0] != 1 && !used[i] {
			sum += arr[i][1]
			j++
		}
	}
	return sum
}

func randomArray(len, n, v int) [][]int {
	arr := make([][]int, len)
	for i := 0; i < len; i++ {
		arr[i] = []int{
			rand.Intn(n) + 1,
			rand.Intn(v) + 1,
		}
	}
	return arr
}

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

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	rand.Seed(time.Now().Unix())
	N := 10
	M := 16
	V := 100
	testTimes := 10000

	fmt.Println("测试开始")
	for i := 0; i < testTimes; i++ {
		n := rand.Intn(N) + 1
		m := rand.Intn(M) + 1
		arr := randomArray(m, n, V)
		ans1 := minCost1(n, m, arr)
		ans2 := minCost2(n, m, arr)
		if ans1 != ans2 {
			fmt.Println("出错了!")
			fmt.Println("n : ", n)
			fmt.Println("m : ", m)
			for _, p := range arr {
				fmt.Println(p[0], " , ", p[1])
			}
			fmt.Println(ans1)
			fmt.Println(ans2)
			break
		}
	}
	fmt.Println("测试结束")

	n := 3000
	m := 3000
	v := 1000000000
	arr := randomArray(n, m, v)
	start := time.Now()
	minCost2(n, m, arr)
	end := time.Now()
	fmt.Println("最大数据量时的运行时间 : ", end.Sub(start).Milliseconds(), " 毫秒")
}

在这里插入图片描述

标签:arr,return,int,fmt,cnts,编号,1号店,店铺
From: https://www.cnblogs.com/moonfdd/p/17930764.html

相关文章

  • 【OpenCV】【Python】关于cv2.findContours()轮廓索引(编号)解析(RETR_TREE)
    在打算自己实现二维码的定位的时候,看到了相关博文的关于cv2.findContours返回的层级信息来定位三个“回”字从而达到定位二维码的目的,但是返回的hierarchy中的层级信息分别对应的是哪个轮廓却困扰了许久,查阅了很多资料最后还是自己手动找出了清晰的规律。关于hierarchy返......
  • 铺先生:两个经营店铺的好办法,大家可以尝试一下
    相信没有那个经营者不想将自己的店铺经营好吧,在如今这个花样层出不穷的年头,你不用一点手段去经营店铺的话,那你的店铺必然是很难与同行竞争的。下面小编就跟大家说两个经营店铺的好办法,大家可以尝试一下。1. 促销营销如果你要问什么营销手段最常见,且效果也明显的话,那必然是促销!在店......
  • 2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a
    2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条,首先将字母a到z编号为0到25编号,纸条上共有n个整数ai,其中a1表示密码里第一个字母的编号,若i>1的话就表示第i个字母和第i-1个字母编号的差值,例如,a2就代表密码中第1个字母和第2个字母编号的差值,若密码是acb,那么纸......
  • 2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条, 首先将字母a
    2023-12-13:用go语言,密码是一串长度为n的小写字母,一则关于密码的线索纸条,首先将字母a到z编号为0到25编号,纸条上共有n个整数ai,其中a1表示密码里第一个字母的编号,若i>1的话就表示第i个字母和第i-1个字母编号的差值,例如,a2就代表密码中第1个字母和第2个字母编号的差值,若密码是acb,......
  • 铺先生:什么因素会影响店铺转让?看看你是否有这些点
    什么因素会影响店铺转让?很多朋友在进行店铺转让事宜的时候,总是莫名其妙的就失败了,自己也不知道问题出在了哪里。百因必有果,任何一件事都不可能平白无故的发生。下面小编就跟大家说说什么因素会影响店铺转让吧。1. 店铺口碑你是否会在网上查阅攻略寻找口碑好的店铺?一个店铺的口碑,是......
  • WPS 标题编号自动关联上一级变化
    1、将标题格式设置成与上一级相同 2、选中标题,设置为标题2  ......
  • winform中,在一个textbook输入编号,按回车键该编号所指的其他数据在另外的textbook中显
    代码:1、链接数据库SqlDataAdapterda;DataTabledt;privatestaticreadonlystringSQL=ConfigurationManager.AppSettings["connectionstring"]; 2、在需要搜索编号的textbook中找到KeyDown属性,双击,代码如下stringaa=textBox1.Text.Trim();stringstr="selectcont......
  • linux 中实现重复字符串的自动编号输出
     001、方法1(base)[root@pc1test]#lsa.txt(base)[root@pc1test]#cata.txt##测试文本aaaaaabbbbcccccccc##利用数组记录字符串重复的次数,借助printf格式化输出(base)[root@pc1test]#awk'{OFS="......
  • c# AES 解密 快手店铺 java的AES加密方法
    JAVA版本的解密:/***参数说明:*message:带解密的密文*privateKey:加密密钥**/StringdecodeMessage=PlatformEventSecurityUtil.decode(message,privateKey);/***方法详情**/privatestaticfinalStringCIPHER_ALGORITHM="AES/CBC/PKCS5Padding"......
  • 提取最大值对应的店铺名
    问题:每行(区域)中最大值对应第一行(店铺名)的结果函数公式解决:公式1=INDEX(K$1:T$1,MATCH(MAX(K2:T2),K2:T2,))公式2=INDEX($1:$1,MOD(MAX(K2:T2*100+COLUMN(K:T)),100))公式3=INDEX(SORT(K$1:T2,ROW(A2),-1,1),1,1)公式1:用Match函数找出一行中最大值在其中匹......