ccf csp 201803-2碰撞的小球(python)

历年题解 CCF CSP历年题解(python)
在这里插入图片描述在这里插入图片描述在这里插入图片描述

样例输入:

3 10 5
4 6 8

10 22 30
14 12 16 6 10 2 8 20 18 4

题目链接:201803-2碰撞的小球

问题分析:

初始化一个全为1长度为小球个数的列表sym(记录小球移动方向),小球碰撞分成三种情况,最左边、中间、最右边,碰撞则sym中该位置变为相反数,表示向相反方向移动

满分例程:

n,L,t=map(int,input().split())
l=list(map(int,input().split()))
sym=[1 for i in range(n)]#记录移动方向,+1为右
#5-9行排序并记录其在原列表l的位置
cp=sorted(l)
ind=[]
for i in cp:
    ind+=[l.index(i)]
l=cp
for m in range(t):
    cp = l.copy()#使用=时l会跟随cp一起变化
    #cp的目的是为了在碰撞时能直接进行操作,且不影响下一个小球确认碰撞
    if l[0]==0 or l[0]==l[1]:#最左边小球的碰撞情况
        sym[0]=-sym[0]
    cp[0]+=sym[0]
    for i in range(1,n-1):#中间小球的碰撞情况
        if l[i]==l[i-1] or l[i]==l[i+1]:
            sym[i]=-sym[i]
        cp[i]+=sym[i]
    if l[n-1]==l[n-2] or l[n-1]==L:#最右边小球的碰撞情况
        sym[n-1]=-sym[n-1]
    cp[n-1]+=sym[n-1]
    l=cp.copy()
print(l[ind.index(0)],end='')
for i in range(1,n):
    print('',l[ind.index(i)],end='')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值