算法题

题目1:(阿里笔试题)

小强最近迷上了一款二维平面闯关游戏,在这款游戏中,会有若干个求依次从高处下降,小强需要操控游戏中的小人左右奔跑,来尽可能接到这些球。

现已知该游戏设定如下:

1.每个球有自己的得分且按照顺序依次落地,在球落地时,只要小人到达该位置,就可以获得相应的分数。
2.在一个球落地或者接到手之后,直到下个球落地之前,小强可以移动最多d个单位距离。
3.小人初始在横轴坐标为0的点,且只能在地面上奔跑,不能升空,即:小人只能在横轴上左右运动。

输入描述:
第一行输入两个正整数 n , d ( 1 ≤ n ≤ 20 , 1 ≤ d ≤ 5 ) , n,d(1\leq n\leq 20, 1\leq d\leq 5), n,d(1n20,1d5), 代表小球个数以及在两个小球落地间隔之间时间内小人最多能左右移动的距离。
第二行输入 n n n个整数, x 1 , x 2 , . . . , x n ( 0 ≤ ∣ x i ∣ ≤ 20 ) x_1,x_2,...,x_n(0\leq |x_i|\leq 20) x1,x2,...,xn(0xi20),分别代表每个小球的落地点,且输入数据以保证按照了落地顺序排序。
第三行输入 n n n个正整数, s 1 , s 2 , . . . , s n ( 1 ≤ s i ≤ 100 ) s_1,s_2,...,s_n(1\leq s_i\leq 100) s1,s2,...,sn(1si100),分别代表每个小球的得分。

输出描述:
输出仅一行一个正整数,代表这局游戏小强最多能得多少分。

示例1
输入:
3 1
-1 1 3
1 1 3
输出:
3

import sys
def myfun(n,xset,sset):
    if n==0:
        return sset[n]
    res=[]
    for i in range(n):
        if (n-i)*d>=abs(xset[n]-xset[i]):
            res.append(myfun(i,xset,sset)+sset[n])
    return max(res)

n,d = map(int,sys.stdin.readline().strip().split())
xset = list(map(int,sys.stdin.readline().strip().split()))
sset=list(map(int,sys.stdin.readline().strip().split()))
# n,d=4,1
# xset=[-1,1,1,3]
# sset=[4,5,6,8]
xset.insert(0,0)
sset.insert(0,0)
res=[]
for i in range(n+1):
    res.append(myfun(i,xset,sset))
print(max(res))

题目2

小强现在有 n n n个物品,每个物品有两种属性 x i x_i xi y i y_i yi,他想要从中挑出尽可能多的物品满足以下条件:对于任意两个物品 i i i j j j,满足 x i < x i x_i<x_i xi<xi y i < y j y_i<y_j yi<yj或者 x i > x i x_i>x_i xi>xi y i > y j y_i>y_j yi>yj.问最多能挑出多少物品。
输入描述:
第一行输入一个正整数 T T T,表示有 T T T组数据。
对于每组数据,第一行输入一个正整数 n n n,表示物品个数。
接下来两行,每行有 n n n个整数。
第一行表示 n n n个节点的 x x x属性。
第二行表示 n n n个节点的 y y y属性。
输出描述:
输出 T T T行,每一行对应每组数据的输出。
示例1
输入
2
3
1 3 2
0 2 3
4
1 5 4 2
10 32 19 21
输出
2
3
程序:

import sys
import numpy as np
def myfun(n,val,x,y):
    if n==0:
        return 0
    res=[]
    for k in range(n):
        if y[k]<val:
            res.append(myfun(k,y[k],x,y)+1)
    if res:
        return max(res)
    else:
        return 0
def main(n,x,y):
    ind=np.argsort(x)
    y=y[ind]
    res = []
    for k in range(n):
        res.append(myfun(k, y[k],x,y) + 1)
    return max(res)



N=int(sys.stdin.readline().strip())
for i in range(N):
    n=int(sys.stdin.readline().strip())
    x=np.array(list(map(int,sys.stdin.readline().strip().split(' '))))
    y=np.array(list(map(int,sys.stdin.readline().strip().split(' '))))

    res1=main(n,x,y)
    # res1=0
    res2=main(n,-x,-y)
    print(max(res1,res2))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值