什么时候想起什么时候更新,随便写写
打包
先贴代码:
# 打包
n, m = map(int, input().split(' '))
weight = list(map(int, input().split(' ')))
left = max(weight)
right = sum(weight)
while right > left:
mid = left + (right - left) // 2
tmp = 0
count = 1
for i in weight:
tmp += i
if tmp > mid:
tmp = i
count += 1
if count > m:
left = mid + 1
else:
right = mid
print(left)
题目: Lazy有N个礼物需要打成M个包裹,邮寄给M个人,这些礼物虽然很便宜,但是很重。Lazy希望每个人得到的礼物的编号都是连续的。为了避免支付高昂的超重费,他还希望让包裹的最大重量最小。
什么意思呢?就是lazy想让每个人的礼物是从头开始分配的(不乱拿,按顺序拿),并且他希望的是每个人能拿到的礼物的重量是基本一致的(好好想一下,侧面意思就是说他希望找到一个比较大的重量,来让所有人的礼物都按这个重量寄出去,)
分析: 那么按上面的说法可以得到要获得的那个重量肯定是从当前的最大重量开始找起(因为比如一个礼物2公斤,那它就是2公斤,你没办法把他劈成两半吧),一直找到所有礼物的总重量为止(可以想象成所有礼物只给一个人)
因此数据范围在[max(weight), sum(weight)]之间找一个合适的数,你想到了什么?当然是二分法
那么就像下面这样我先找到mid,假设mid就是我们最终的答案,然后我们用一个循环,从头开始分配礼物,每达到mid一次就说明可以打包一次,count++,然后看打包的次数满不满足要分配的人数,要是不满足,说明这个mid太大了,不够我们分,于是right左移
while right > left:
mid = left + (right - left) // 2
tmp = 0
count = 1
for i in weight:
tmp += i
if tmp > mid:
tmp = i
count += 1
if count > m:
left = mid + 1
else:
right = mid
阴谋:
**题目:**圣杯战争开始了。 为了收集敌人的情报,言峰绮礼命令他的使魔Assassin将自己的灵体分成n份,分别监视教堂外的长直走道。
Assassin每份灵体的能力不同。 第i份灵体可以监视到的区域是闭区间[ai,bi]。
绮礼想知道,监控范围内的区域的总长度是多少。
比如,第一份灵体的视野是[−1,1],第二份灵体的视野是[0,2],第三份灵体的视野是[3,4]。 那么绮礼能获得的全部视野是[−1,2]∪[3,4],长度为4。
老二次元了
分析 :就是简单的找交集
# 查交集
n = eval(input())
vs = []
res = []
ans = 0
for _ in range(n):
vs.append(list(map(int, input().split(' '))))
vs.sort(key=lambda x: x[0])
for i in vs:
if not res or res[-1][1] < i[0]:
res.append(i)
else:
res[-1][-1] = max(res[-1][-1], i[-1])
for i in range(len(res)):
ans += res[i][1] - res[i][0]
print(ans)