研发工程师L2_编程题

1、【模板】栈

题目描述:

请你实现一个栈。

操作:

push x:将 加x 入栈,保证 x为 int 型整数。

pop:输出栈顶,并让栈顶出栈

top:输出栈顶,栈顶不出栈

输入描述:

第一行为一个正整数 n ,代表操作次数。(1≤n≤100000)

接下来的 n,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。

输出描述:

如果操作为push,则不输出任何东西。

如果为另外两种,若栈为空,则输出 "error“

否则按对应操作输出。

示例1

输入6
push 1
pop
top
push 2
push 3
pop
输出1
error
3
class Stack:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items) - 1]

    def size(self):
        return self.items[len(self.items)]

s = Stack()
num = int(input())
for i in range(num):
    a = input()
    if a[0:4] == "push":
        b = a.split(" ")
        s.push(int(b[1]))
    if a == "pop":
        if s.isEmpty() == True:
            print("error")
        else:
            print(s.peek())
            s.pop()
    if a == "top":
        if s.isEmpty() == True:
            print("error")
        else:
            print(s.peek())

 2、小红取数

题目描述:

小红拿到了一个数组,她想取一些数使得取的数之和尽可能大,但要求这个和必须是 k 的倍数。你能帮帮她吗?

输入描述:

输出描述:

如果没有合法方案,输出 -1。
否则输出最大的和。

示例1

输入5 5
4 8 2 9 1
输出20

说明:取后四个数即可

n, k = map(int, input().split())
arr = list(map(int, input().split()))
map1 = [[] for _ in range(k)]
dp = [[0] * k for _ in range(n + 1)]
maxi = 0
for i in range(1, n + 1):
    for j in range(k):
        dp[i][j] = max(dp[i - 1][j], dp[i][j])
        dp[i][(dp[i - 1][j] + arr[i - 1]) % k] = max(
            dp[i - 1][j] + arr[i - 1], dp[i][(dp[i - 1][j] + arr[i - 1]) % k]
        )
if dp[-1][0]:
    print(dp[-1][0])
else:
    print(-1)

 3、串

题目描述:

长度不超过nn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对10^9+7取模。所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。例如,"unoacscc"包含子序列"us",但"scscucu"则不包含子序列"us"

输入描述:

一个正整数n

2 \leq n \leq 10^6

输出描述:

一个正整数,为满足条件的字符串数量对10^9+7取模的值

n = int(input())
def dfs(n):
    if n == 2:return 1
    dp = [25,1,0]
    result = 0
    mod = 10**9+7
    for i in range(2,n+1):
        dp[2] = (dp[1]+dp[2]*26)%mod
        dp[1] = (dp[0]+dp[1]*25)%mod
        dp[0] = (dp[0]*25)%mod 
        result += dp[2]
    return result%mod
print(dfs(n))

 4、经此一役小红所向无敌

题目描述:

经过重重困难,对立和光终于来到魔王城,和最终的大魔王——小红进行决战。

已知小红的血量是  10^{999999999}
对立的攻击力是 a ,血量是 h 。
光的攻击力是 b,血量是 k 。

每回合光先对小红发起攻击,然后对立对小红发起攻击,然后小红展开幻术,令光和对立同时互相攻击。
每次攻击后,受击者的血量会减掉攻击者的攻击力。
当光和对立其中一人死亡后,另一人会悲痛欲绝,对小红发出自己攻击力*10的伤害的大招,然后自杀。(若两人同时死亡,则两人都无法发出大招)

小红想知道,弱小的光和对立,她们能对自己造成多少点伤害?

 说明:
第一回合,小红受到了对立和光的攻击,并让她们互相攻击。第一回合结束时,小红共受到 3 点伤害。这时对立血量为 2 ,光的血量为 1 。
第二回合,小红受到了对立和光的攻击,并让她们互相攻击。这时对立血量为 1 ,光的血量为 0 死亡。对立放出大招后自杀。本回合小红共受到 23 点伤害。
小红受到的总伤害为 3+23=263+23=263+23=26 。

import math
a,h,b,k = map(int,input().split())
t1 = math.ceil(h/b)
t2 = math.ceil(k/a)
if t1==t2:
    out = t1*(a+b)
elif t1<t2:
    out = t1*(a+b)+b*10
else:
    out = t2*(a+b)+a*10
print(out)

 5、加减

题目描述:

小红拿到了一个长度为 n  的数组。她每次操作可以让某个数加 1 或者某个数减 1 。
小红最多能进行 k 次操作。她希望操作结束后,该数组出现次数最多的元素次数尽可能多。
你能求出这个最大的次数吗?

n,k=map(int,input().split())
arr = list(map(int,input().split()))
arr.sort()
arr1 = [0 for i in range(n+1)]
for i in range(1,n+1):
    arr1[i]=arr1[i-1]+arr[i-1]    
p1=0
p2=0
maxlen=1
while(p2<n):
    p=(p2+p1)//2
    step= arr[p]*(p-p1+1)-(arr1[p+1]-arr1[p1]) +arr1[p2+1]-arr1[p+1]-arr[p]*(p2-p)
    if(step<=k):
        maxlen=max(maxlen,p2+1-p1)
        p2=p2+1
    elif p1<p2:
        p1=p1+1
print(maxlen)

 6、kotori和糖果

题目描述:

kotori共有n块糖果,每块糖果的初始状态是分散的,她想把这些糖果聚在一堆。但她每次只能把两堆糖果合并成一堆。已知把两堆数量为a和b的糖果聚在一堆的代价是|a-b|。kotori想知道,她把这n块糖果聚在一堆的最小代价是多少?

输入描述:

第一行是一个正整数T,代表数据组数。第二行到第T+1行,每行一个非负整数n,代表kotori的糖果总数量。

输出描述:

每行一个整数,代表kotori需要花费的最小代价。

示例:


备注:对于50%的数据,0<T≤100000, 0≤n≤100000 对于另外50%的数据,T=1 , 0≤n≤1e18

T=int(input())
m={}
def s(n):
    if n <3:
        return 0
    if n in m:
        return m[n]
    else:
        c=s(n//2)+s(n-n//2)+n%2
        m[n]=c
        return c
for i in range(T):
    print(s(int(input())))

 7、kotori和迷宫

题目描述:

kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能到达的,最近的出口离她有多远?

输入描述:

第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30);后面紧跟着n行长度为m的字符串来描述迷宫。'k'代表kotori开始的位置,'.'代表道路,'*'代表墙壁,'e'代表出口。保证输入合法。

输出描述:

若有出口可以抵达,则输出2个整数,第一个代表kotori可选择的出口的数量,第二个代表kotori到最近的出口的步数。(注意,kotori到达出口一定会离开迷宫)若没有出口可以抵达,则输出-1。

n,m=map(int,input().split())
ls=[]
for i in range(n):
    ls.append(list(input()))
      
def maze(ls,si,sj,dt):
    ec=0
    lc=0
    ml=200    
    q=list()
    q.append((si,sj,lc))
    while q:
        h,c,lc=q.pop()
        lc+=1  
        for a,b in [(h-1,c),(h+1,c),(h,c-1),(h,c+1)]:
            if 0<=a<n and 0<=b<m:
                if ls[a][b]=='.':
                    ls[a][b]='f'
                    q.append((a,b,lc))                                
                if ls[a][b]==dt:
                    ec+=1
                    ml=min(lc,ml)
                    ls[a][b]='f'
    if ec==0:
        print(-1)
    else:    
        print(ec,ml)
  
for i in range(n):
    for j in range(m):
        if ls[i][j]=='k':
            maze(ls,i,j,'e')

---------------------------------欢迎提供L2题目,持续更新-------------------------------------

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Le_ander

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值