CCF 201709-1&2 打酱油 公共钥匙盒 Python

在这里插入图片描述在这里插入图片描述

1、打酱油

#打酱油
n = int(input())
ans = 0
if n >= 50:  #如果手上的钱够买5瓶
    number = n // 50  #可以买多少组的5瓶
    ans += number * 7
    n -= 50 * number
if n >= 30:  #如果手上的钱够买3瓶
    number = n // 30
    ans += 4 * number
    n -= number * 30
if n >= 10:
    number = n // 10
    ans += number
print(ans)
    

2、公共钥匙盒
两个方法,但思路都一样,表现形式不同,差的是执行时间。本来打算试试用双指针遍历时间,对空钥匙勾查找进行优化的,但没有时间了,就先这样吧

import heapq
from collections import defaultdict
#公共钥匙盒
n,k = map(int,input().split())
key = [i for i in range(n+1)]  #将钥匙编号进行初始化,要是被借走,就将其初始化为0
key[0] = float('-inf')
borrow_time = defaultdict(list)  #分开统计老师借钥匙和换钥匙的时间点有哪些
return_time = defaultdict(list)
for i in range(k):
    a,b,c = map(int,input().split())  #在b时刻借钥匙,使用c个单位的钥匙归还
    borrow_time[b].append(a)
    heapq.heappush(return_time[c+b],a)  #因为还钥匙是按照钥匙的大小编号还,所以借用小根堆
#1、将借钥匙的时间和还钥匙的时间合并,挨个遍历
time = sorted(set(list(borrow_time)+list(return_time)))
for i in time:
    if i in return_time.keys():  #如果同一时刻
        j = 1
        while j < n + 1 and return_time[i]:
            if key[j] == 0:
                key[j] = heapq.heappop(return_time[i])
            j += 1
    if i in borrow_time.keys():
        while borrow_time[i]:  #借钥匙的时候,钥匙的位置是动态变化的
            key[key.index(borrow_time[i].pop(0))] = 0
'''
#2、双指针法,判断当前时刻是处于借钥匙还是还钥匙
borrow = sorted(list(borrow_time.keys()))
return_ = sorted(list(return_time.keys()))
i = 0
j = 0
while i < len(borrow) or j < len(return_):
    if i 
'''                            
for i in key[1:]:
    print(i,end=' ')

B

#公共钥匙盒
N,K = map(int,input().split())
key = []  #每个钥匙位存放的值位钥匙编号,为零则表示借出去了
for i in range(N+1):
    key.append(i)
key[0] = -1
borrow = {}  #统计每个时间段借钥匙和换钥匙的情况
_return = {}
for i in range(K):
    t = list(map(int,input().split()))  #三个整数分别表示要使用的钥匙编号、开始上课的时间、上课时长
    if t[1] not in borrow.keys():
        borrow[t[1]] = [t[0]]
    else:
        borrow[t[1]].append(t[0])
    if t[1]+t[2] not in _return.keys():
        _return[t[1]+t[2]] = [t[0]]
    else:
        _return[t[1]+t[2]].append(t[0])
for i in sorted(set(list(borrow.keys())+list(_return.keys()))):  #合并所有借钥匙和还钥匙的时刻
    #判断每个时刻是借出去的时刻还是还的时刻,如果两个都属于,就先还再借
    if i in _return.keys():  
        for j in sorted(_return[i]):
            for k in range(N+1):
                if key[k] == 0:
                    key[k] = j
                    break
    if i in borrow.keys():
        for j in borrow[i]:
            key[key.index(j)] = 0
for i in key[1:]:
    print(i,end=' ')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值