当前位置: 代码迷 >> 综合 >> CCF 201803-2 碰撞的小球(python)满分代码
  详细解决方案

CCF 201803-2 碰撞的小球(python)满分代码

热度:26   发布时间:2023-12-14 11:39:26.0

CCF 201803-2 碰撞的小球
python 3 代码实现

1.题目
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2. 解题思想
利用两个数组A,B来存储小球的相对状态,正数表示向前运动,负数表示向后反向运动。每当小球发生碰撞或者抵达终点后进行反向运动。首先数组A存储初始队列,然后对A进行遍历,每个小球的状态发生变化后,存储到B数组,每秒对A数组遍历结束后,将B的数组值复制到A中,然后按时间重复此项操作。注意题目中给定的小球初始置状态并不有序。所以在判断小球是否发生碰撞可以通过采用集合来判断 首先将小球自己从数组中取出,然后判断剩余数组的集合元素中是否含有值与自己相同的元素,如果有说明此时小球应该发生碰撞。

3. 核心代码
3.0 反向运动判断

		mid = copy.deepcopy(A)mid.pop(j)mid = map(abs, mid)mid = set(mid)if (j < (n - 1)) and abs(A[j]) in mid:B[j] = A[j] * (-1) + 1elif (j > 0) and abs(A[j]) in mid:B[j] = A[j] * (-1) + 1else:B[j] += 1if B[j] > L:B[j] = -(L - 1)if A[j] == 0 and -2 < B[j] < 0:B[j] = 1

4. 完整代码

# -*- ecoding: utf-8 -*-
# @ModuleName: CSP201803-2
# @Function: 
# @Author: ZhangMing
# @Time: 2020/10/6 11:10
import copyn, L, t = map(int, input().split())A = list(map(int, input().split()))
B = copy.deepcopy(A)
for i in range(t):for j in range(n):mid = copy.deepcopy(A)mid.pop(j)mid = map(abs, mid)mid = set(mid)if (j < (n - 1)) and abs(A[j]) in mid:B[j] = A[j] * (-1) + 1elif (j > 0) and abs(A[j]) in mid:B[j] = A[j] * (-1) + 1else:B[j] += 1if B[j] > L:B[j] = -(L - 1)if A[j] == 0 and -2 < B[j] < 0:B[j] = 1A = copy.deepcopy(B)
out = list(map(abs, A))
out = map(str, out)
print(' '.join(out))

5. 代码结果
在这里插入图片描述

我的代码耗时较长,应该还有改进的地方,欢迎大家指正交流。