例题1:最少砝码:
问题描述
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 NN 的正整数重量。
那么这套砝码最少需要包含多少个砝码?
注意砝码可以放在天平两边。
输入格式
输入包含一个正整数 N。
输出格式
输出一个整数代表答案。
样例输入
7
样例输出
3
样例说明
33 个砝码重量是 1、4、61、4、6,可以称出 11 至 77的所有重量。
1 = 1;1=1;
2 = 6 − 42=6−4(天平一边放 66,另一边放 44);
3 = 4 − 1;3=4−1;
4 = 4;4=4;
5 = 6 − 1;5=6−1;
6 = 6;6=6;
7 = 1 + 6;7=1+6;
少于 33 个砝码不可能称出 11 至 77 的所有重量。
评测用例规模与约定
对于所有评测用例,1 ≤ N ≤ 1000000000。
运行限制
最大运行时间:1s
最大运行内存: 512M
思路:参考:第十二届蓝桥杯省赛-最少砝码C++-Dotcpp编程社区
因为本题要求的砝码的最少个数,因此我们可以采用贪心的思想来思考这道题目。
称出重量1时需要一个重量为1的砝码。
称重量2的时候在重量为1的砝码的基础上增加一个重量为3的砝码,至于为什么是三,是因为如果增加一个重量为3的砝码时可以称出来的重量为1,2,3,4。若果增加别的重量的砝码最后称出来的总重量的情况都比增加3要少。因此可以看出每次增加新的砝码时都要增加重量最大的砝码。
下面我们来继续往下推理来验证一下这种思想的正确性。
目前有重量为1和3的砝码,可以称出来1,2,3,4。
接下来该称5,此时增加重量最大的砝码应为9。增加9后,最大可称13,我们来看看5-12中间的数能不能求出来。
5=9-4
6=9-3
7=9-3+1
8=9-1
9=9
10=9+1
11=9+3-1
12=9+3
13=9+3+1
是可以的。
接下来该称14,此时增加重量最大的砝码应该为27。增加27后,最大可称40。14-40之间的数是完全可以由1,3,9,27三个砝码来称出来的。就不一一列举了。因此我们可以发现规律了,每次增加的砝码都是上一次增加的砝码重量乘以三。
砝码序号 | 砝码重量 | 最大可称重量 |
1 | 1 | 1 |
2 | 3 | 4 |
3 | 9 | 13 |
4 | 27 | 40 |
python代码:
n=int(input())
maxw=1
index=1
addw=1
while n>maxw:
addw=addw*3
index=index+1
maxw=maxw+addw
print(index)
例题2:翻硬币
题目描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作。
输入
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度< 1000
输出
一个整数,表示最小操作步数。
样例输入
*o**o***o*** *o***o**o***
样例输出
1
这个题从两个字符串开始进行比较,不一样就翻转。这样求出来的就是最少翻动次数。
代码:
s=list(input())
s1=list(input())
a=['*','o']
ans=0
for i in range(len(s)-1):
if s[i]==s1[i]:
continue
else:
ans=ans+1
tmp=a[1-a.index(s[i])]
s[i]=tmp
tmp1=a[1-a.index(s[i+1])]
s[i+1]=tmp1
print(ans)
例题3:huffuman树
题目描述
Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
2. 重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
输入
输入的第一行包含一个正整数n(n< =100)。
接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
输出
输出用这些数构造Huffman树的总费用。
样例输入
5 5 3 8 2 9
样例输出
59
代码:
n=int(input())
s=list(map(int,input().split()))
s.sort()
ans=0
for i in range(n-1):
tmp=s[0]+s[1]
ans=ans+tmp
s.pop(0)
s.pop(0)
s.append(tmp)
s.sort()
print(ans)