第十届蓝桥杯 轨道炮

相信许多人刚拿到这一题觉得这题并不难,但是写码的时候就麻烦了,因为不知道在什么时候停止循环,我也是卡在了这个地方,目前最好的解决方法是设定一个最大的循环次数,能拿到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()函数可以优化减少时间,可以搜“统计列表元素个数”看看别人的方法。

在网上找了很久也没找到循环停止的条件,有大神知道一定要来私信!!!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值