ccf公共钥匙盒python_ccf csp 201709-2公共钥匙盒(python)

样例输入:

5 2

4 3 3

2 2 7

5 7

1 1 14

3 3 12

1 15 12

2 7 20

3 18 12

4 21 19

5 30 9

问题分析:

建立一个时间列表,将取、存都按时间从小到大排序,记录钥匙编号,时间相同时,先放回钥匙后取出钥匙,取按钥匙编号从小到大

使用第一个样例输入

out=[[2, 2], [4, 3], [0, 11000]]

put=[[4, 6], [2, 9], [0, 11000]]

t=[2, 4, 4, 2]

即整个顺序为先将2号钥匙取出,再将4号钥匙取出,再将4号钥匙放回,最后将2号钥匙放回

满分例程:

N,K=map(int,input().split())

y=[]

for i in range(1,N+1):#初始状态钥匙盒

y.append(i)

out=[[0,11000]]#取出钥匙 [0,11000]防止数组越界,或在排序后out、put后添加

put=[[0,11000]]#放入钥匙 取题目给定out=[[0,10001]]put=[[0,10101]]模拟是70分

for i in range(K):

w,s,c=map(int,input().split())

out.append([w,s])

put.append([w,s+c])

#out.sort(key=lambda x:x[0])取出未要求:多位老师同时取钥匙,按钥匙编号从小到大的顺序取

out.sort(key=lambda x:x[1])#按时间排序

put.sort(key=lambda x:x[0])#有多位老师同时还钥匙,按钥匙编号从小到大的顺序还

put.sort(key=lambda x:x[1])#按时间排序

o,p=0,0#分别是取出、放入钥匙的索引

t=[]#时间线列表

for i in range(2*K):

#时间小的优先或者时间相同时存钥匙优先

if out[o][1]>=put[p][1]:

t.append(put[p][0])

p+=1

else:

t.append(out[o][0])

o+=1

for i in t:

if i in y:#有该编号钥匙即取钥匙

for j in range(N):

if y[j]==i:

y[j]=0

break

else:#没用该编号钥匙即存钥匙

for j in range(N):

if y[j]==0:

y[j]=i

break

print(y[0],end='')

for i in range(1,N):

print('',y[i],end='')

#如果将程序中3到25行换为以下程序,模拟得分40分

#未考虑如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。

for i in range(1,N+1):

y.append(i)

l=[]

for i in range(K):

w,s,c=map(int,input().split())

l.append([w,s])

l.append([w,s+c])

l.sort(key=lambda x:x[0])

l.sort(key=lambda x:x[1])

t=[]

for i in l:

t.append(i[0])

标签:201709,python,range,钥匙,key,put,ccf,append,out

来源: https://blog.csdn.net/weixin_44690402/article/details/112976601

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值