相信许多人刚拿到这一题觉得这题并不难,但是写码的时候就麻烦了,因为不知道在什么时候停止循环,我也是卡在了这个地方,目前最好的解决方法是设定一个最大的循环次数,能拿到60%的分数。
1,创建四个列表分别储存x,y,v,和方向
2,定义一个函数,返回一条直线上最多的单位
3,循环1000次,不断更新x,y的值,并调用函数
代码如下
相信许多人刚拿到这一题觉得这题并不难,但是写码的时候就麻烦了,因为不知道在什么时候停止循环,我也是卡在了这个地方,目前最好的解决方法是设定一个最大的循环次数,能拿到60%的分数。
1,创建四个列表分别储存x,y,v,和方向
2,定义一个函数,返回一条直线上最多的单位
3,循环1000次,不断更新x,y的值,并调用函数
代码如下
n = int(input())
x_list = []
y_list = []
v_list = []
f_list = []
# 将参数分别储存在四个列表中
for _ in range(n):
x, y, v, f = input().split()
x_list.append(int(x))
y_list.append(int(y))
v_list.append(int(v))
f_list.append(f)
# 定义函数,获得直线上最多的单位数
# x或y坐标一样表示在同一直线上
def get_max(it):
# 储存it中每个不重复元素,使用集合
my_set = set(it)
# it中每个元素出现的次数
set_list = []
for i in my_set:
set_list.append(it.count(i))
ans = max(set_list)
# 返回出现次数最多的坐标
return ans
# 初始化结果为0
num = 0
# 在1000秒之内求最大值(最多过60%)
for t in range(1000):
# 获得当前结果的最大值,更新num(当t=0时也要算进去,所以先取值,再更新列表)
max_x = get_max(x_list)
max_y = get_max(y_list)
num = max(num, max_x, max_y)
# 根据f_list的方向值来确定对那个列表进行+-操作
# 遍历列表所有元素,个数为n
for j in range(n):
if f_list[j] == "R":
x_list[j] += v_list[j]
elif f_list[j] == "L":
x_list[j] -= v_list[j]
elif f_list[j] == "U":
y_list[j] += v_list[j]
elif f_list[j] == "D":
y_list[j] -= v_list[j]
# 输出
print(num)
代码中get_it()函数可以优化减少时间,可以搜“统计列表元素个数”看看别人的方法。
在网上找了很久也没找到循环停止的条件,有大神知道一定要来私信!!!