题目描述
给定正整数N,你的任务是用最少的操作次数把1,2,3…N中所有数都变为0。
每次操作可从序列中选任意个整数,同时减去一个相同的正整数。
例如:1,2,3可以同时把后两个减去2,得到1,0,1,然后再选第一个和第三个,同时减去1即可
解法:
当n=3时,对数列1,2,3,把2和3同时减去2得到1,0,1,然后再选第一个和第三个,同时减去1即可。类似的,比如当n=7时,对数列1,2,3,4,5,6,7,把4,5,6,7同时减去4得到1,2,3,0,1,2,3,此时问题等价于n=3时的情况。令f(n)表示最少操作的次数,则有f(1)=1,f(2)=2,f(3)=2,f(4)=3,f(5)=3,f(6)=3,f(7)=3,f(8)=4,f(9)=4…通过以上规律可知,当2 ^ (m-1) ≤ n < 2^m 时,f(n)=m
num = int(input())
cnt = 0
while num > 0:
cnt += 1
num = num // 2
print(cnt)
题目描述
摞箱子。第 i 个箱子可以放入第 j 个箱子要求:(1)第 j 个箱子为空(2)第 i 个箱子未放入其他箱子 (3)第 i 个箱子的边长小于第 j 个箱子。箱子为正方形,求可见的箱子的最小数
样例一:
输入:
第一行:箱子总数
第二行:每个箱子的边长
5
3 2 4 1 4
输出:
2
解法:
最开始笔试的时候我选择用类似链表的方法,如
4 - 3 - 2 - 1
4
使用 defaultdict 很容易就实现,但是后台数据有5%过大运行超时。后来,仔细一想,这道题和第一题其实一样,是个巧法题——只要找到某个数的最多重复次数就可以了
from collections import Counter
n = int(input())
l = list(map(int, input().split()))
counter = Counter(l)
a, b = counter.most_common()[0]
print(b)
题目描述
同LeetCode 407 - 接雨水II
样例一
输入:
5 5
1 3 1 2 1
2 1 3 1 1
1 4 2 6 1
1 3 1 3 1
1 1 5 1 1
输入:
4
解法:
2-D的接雨水问题的边界不再是线段的两个端点,而是矩形的一周,所以我们用优先队列维护所有边界点,收缩时,也不仅仅只有左右两个方向,而是上下左右四个方向,并且维护一个visit的数组,记录哪些坐标已经被访问过,不然会造成重复求解。
import heapq
def rain(g):
if not g: return 0
q = []
row = len(g)
col = len(g[0])
if row < 3 or col < 3: return 0
visited = [[False] * col for _ in range(row)]
for i in range(row):
heapq.heappush(q, (g[i][0], (i, 0)))
visited[i][0] = True
heapq.heappush(q, (g[i][col -1], (i, col -1)))
visited[i][col - 1] = True
for j in range(1, col - 1):
heapq.heappush(q, (g[0][j], (0, j)))
visited[0][j] = True
heapq.heappush(q, (g[row - 1][j], (row - 1, j)))
visited[row - 1][j] = True
d = [[0, 1],[0, -1],[1, 0],[-1, 0]]
ans = 0
while q:
h, (x, y) = heapq.heappop(q)
for i in range(4):
newx = x + d[i][0]
newy = y + d[i][1]
if 0 <= newx < row and 0 <= newy <col and visited[newx][newy] == False:
newh = g[newx][newy]
if newh < h:
ans += h- newh
g[newx][newy] = h
heapq.heappush(q, (g[newx][newy], (newx, newy)))
visited[newx][newy] = True
return ans
n, m = map(int, input().split())
g = []
for _ in range(n):
tmp = list(map(int, input().split()))
g.append(tmp)
ans = rain(g)
print(ans)