题目
在很久很久以前,有n 个部落居住在平原上,依次编号为 1到n。第i 个部落的人数为ti。
有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。
每次谈判,小蓝只能邀请两个部落参加,花费的金币数量为两个部落的人数之和,谈判的效果是两个部落联合成一个部落(人数为原来两个部落的人数之和)。
输出一个整数,表示最小花费。
思路
跟之前有个题目很像,老师给学生答疑花费时间最小那个。 花费金币为两部落人数之和,因此最先合并的部落里的人会一直花金币到最后。花费最小也就是将最小部落的最先进行谈判合并,可以使用暴力去每次对最小的两个数进行相加,记录和(也就是所花费金币数)。另外可以进行找规律:比如9 1 3 5 ,31 = 1 * 3 + 3 * 3 + 5 * 2 + 9 * 1
代码
import os
import sys
# 请在此输入您的代码
n = int(input())
datas = list(map(int, input().split()))
new_data = sorted(datas)
# money = 0
# while(len(new_data) > 1):
# a = new_data[0]
# b = new_data[1]
# new_data.remove(a)
# new_data.remove(b)
# money += a + b
# new_data.append(a+b)
# new_data = sorted(new_data)
# print(money)
# 1 3 5 9 中 money = 1 * 3 + 3 * 3 + 5 * 2 + 9 * 1 = 31
nums = len(new_data) - 1
money = 0
i = 0
while(nums > 0):
money += new_data[i] * nums
if i == 0: # 前面最小的两个数都是 * 3
i += 1
continue
else:
nums -= 1
i += 1
print(money)
题目
蓝桥学院由21 栋教学楼组成,教学楼编号 1到21。对于两栋教学楼 a 和 b,当 a 和b 互质时,a 和b 之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。
小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?
两个访问方案不同是指存在某个 i,小蓝在两个访问方法中访问完教学楼 i 后访问了不同的教学楼。
思路
不太懂,直接看的题解。这里更详细一点:蓝桥杯.回路计数(状压DP)_UmVfX1BvaW50的博客-CSDN博客
代码
import os
import sys
# 请在此输入您的代码
import math
n = 21
# 每个数与1都互质 即每栋楼都能直达1号教学楼
state = 1<<21 # <<右移运算符 使用21位二进制数来表示这些楼是否被访问过 当state全为1时 则表示一种寻路方案
# 存放教学楼之间是否有路径
Map = [[0]*(n+1) for i in range(n+1)]
dp = [[0]*n for i in range(state)]
dp[1][0] = 1 # 只访问1号楼
for i in range(n+1):
for j in range(n+1):
if math.gcd(i,j)==1:
Map[i][j] = 1
for i in range(state):
for j in range(n):
if i>>j & 1: # (状态 i 按位右移j位,之后取余) (判断状态 i 二进制数的第 j 位是否为1) j这栋楼是不是访问过
for k in range(n):
if Map[k+1][j+1] == 1 and i>>k &1:
dp[i][j] +=dp[i-(1<<j)][k]
print(sum(dp[-1])-dp[-1][0])