历年题解 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='')