牛客6

[编程题] 迷宫寻路

时间限制:1秒
空间限制:131072K
假设一个探险家被困在了地底的迷宫之中,要从当前位置开始找到一条通往迷宫出口的路径。迷宫可以用一个二维矩阵组成,有的部分是墙,有的部分是路。迷宫之中有的路上还有门,每扇门都在迷宫的某个地方有与之匹配的钥匙,只有先拿到钥匙才能打开门。请设计一个算法,帮助探险家找到脱困的最短路径。如前所述,迷宫是通过一个二维矩阵表示的,每个元素的值的含义如下 0-墙,1-路,2-探险家的起始位置,3-迷宫的出口,大写字母-门,小写字母-对应大写字母所代表的门的钥匙
输入描述:
迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数M和N
后面的M行是矩阵的数据,每一行对应与矩阵的一行(中间没有空格)。M和N都不超过100, 门不超过10扇。

输出描述:
路径的长度,是一个整数

输入例子1:
5 5
02111
01a0A
01003
01001
01111

输出例子1:
7

求一下Python正确的答案,这个是根据别人的答案写的,没法AC

#coding=utf-8

class node:
    def __init__(self,x,y,k,step):
        self.x=x
        self.y=y
        self.k=k
        self.step=step

def bfs(startX,startY,arr,Next,N,M,book):
    Q=[]
    Q.append(node(startX,startY,0,0))
    while len(Q)>=0:
        head=Q[0]
        del Q[0]
        if arr[head.x][head.y]=='3':
            return head.step
        for i in range(4):
            nx=head.x+Next[i][0] #上下左右四个方向
            ny=head.y+Next[i][1]
            if nx>=N or nx<0 or ny>=M or ny<0 or arr[nx][ny]=='0':
                continue
            key=head.k
            if arr[nx][ny].islower():
                key=key|(1<<(ord(arr[nx][ny])-ord('a')))
            if arr[nx][ny].isupper() and key&(1<<(ord(arr[nx][ny])-ord('A')))==0:
                continue
            if not book[nx][ny][key]:
                book[nx][ny][key]=1
                Q.append(node(nx,ny,key,head.step+1))
    return 0

while True:
    try:
        s=map(int,raw_input().strip().split())
        M=s[0];N=s[1]
        arr=[]
        for i in range(M):
            arr.append(raw_input().strip())
        Next=[[0,1],[0,-1],[1,0],[-1,0]]
        flag=0
        book=[[[0 for i in range(1024)] for j in range(M)] for j in range(N)]
        for i in range(M):
            if flag==1:
                break
            for j in range(N):
                if arr[i][j]=='2':
                    flag=1
                    book[i][j][0]=1
                    print bfs(i,j,arr,Next,N,M,book)
                    break

    except:
        break

book[x][y][key]的意义就是 横坐标为x,纵坐标为y,钥匙状态为key的点是否访问过
钥匙的状态 就用二进制数表示 最多10 把钥匙 那就是1024
比如我现在有第二把钥匙和第四把钥匙 那么我的钥匙状态就是 0101000000 也就是 320

[编程题] 合唱团

时间限制:1秒
空间限制:32768K
有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
输入描述:
每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。

输出描述:
输出一行表示最大的乘积。

输入例子1:
3
7 4 7
2 50

输出例子1:
49

mx记录最大,mn记录最小

#coding=utf-8

while True:
    try:
        n=input()
        a=map(int,raw_input().strip().split())
        ik,d=map(int,raw_input().strip().split())
        if n==1:
            print a[0]
        else:
            mx=[[0 for i in range(n)] for i in range(ik)]
            mn=[[0 for i in range(n)] for i in range(ik)]
            m=0 
            for i in range(n):
                mx[0][i]=mn[0][i]=a[i]
                for k in range(1,ik): 
                    for j in range(i-1,-1,-1): 
                        if i-j>d: 
                            break 
                        mx[k][i]=max(mx[k][i],max(mx[k-1][j]*a[i],mn[k-1][j]*a[i]))
                        mn[k][i]=min(mn[k][i],min(mx[k-1][j]*a[i],mn[k-1][j]*a[i]))
                m=max(m,mx[ik-1][i])
            print m
    except:
        break

[编程题] 下厨房

时间限制:1秒
空间限制:32768K
牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。
输入描述:
每个输入包含 1 个测试用例。每个测试用例的第 i 行,表示完成第 i 件料理需要哪些材料,各个材料用空格隔开,输入只包含大写英文字母和空格,输入文件不超过 50 行,每一行不超过 50 个字符。

输出描述:
输出一行一个数字表示完成所有料理需要多少种不同的材料。

输入例子1:
BUTTER FLOUR
HONEY FLOUR EGG

输出例子1:
4

#coding=utf-8

import sys

a=[]
for line in sys.stdin:
    if line.strip()=='':
        break
    a.extend(line.split())
print len(set(a))

[编程题] 分苹果

时间限制:1秒
空间限制:32768K
n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 <= ai <= 100)。

输出描述:
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。

输入例子1:
4
7 15 9 5

输出例子1:
3

自己的有点麻烦

#coding=utf-8

while True:
    try:
        n=input()
        a=map(int,raw_input().strip().split())
        temp=0
        for i in range(1,n):
            if a[i]%2!=a[0]%2:
                temp=1
                break
        if temp==1:
            print -1
        else:
            for i in range(n):
                a[i]/=2
            count=0
            while max(a)!=min(a):
                ma=a.index(max(a));mi=a.index(min(a))
                count+=1
                a[ma]-=1;a[mi]+=1
            print count
    except:
        break

https://www.nowcoder.com/questionTerminal/a174820de48147d489f64103af152709
来源:牛客网
先求出平均数,因为这个数组只可能全是偶数或者全是奇数,所以每个数减去平均数模二取余一定是偶数,只需要算小于平均数的,将差值累加。

while True:
    try:
        flag=True
        n=input()
        a=list(raw_input().split())
        a=[int(i) for i in a]
        if sum(a)%n!=0:
            print -1
        else:
            e=sum(a)/n
            s=0
            for i in a:
                if abs(i-e)%2==1:
                    print -1
                    flag=False
                    break
                if i<e:
                    s+=e-i
            if flag:
                print s/2
    except:
        break

[编程题] 星际穿越

时间限制:1秒
空间限制:32768K
航天飞行器是一项复杂而又精密的仪器,飞行器的损耗主要集中在发射和降落的过程,科学家根据实验数据估计,如果在发射过程中,产生了 x 程度的损耗,那么在降落的过程中就会产生 x2 程度的损耗,如果飞船的总损耗超过了它的耐久度,飞行器就会爆炸坠毁。问一艘耐久度为 h 的飞行器,假设在飞行过程中不产生损耗,那么为了保证其可以安全的到达目的地,只考虑整数解,至多发射过程中可以承受多少程度的损耗?
输入描述:
每个输入包含一个测试用例。每个测试用例包含一行一个整数 h (1 <= h <= 10^18)。

输出描述:
输出一行一个整数表示结果。

输入例子1:
10

输出例子1:
2

如果从1开始循环会超时

#coding=utf-8

import math

while True:
    try:
        n=input()
        x=int(math.sqrt(n))
        while (x+x**2)>n:
            x-=1
        print x
    except:
        break

还可以用(sqrt(1+4*h)-1)/2

[编程题] 藏宝图

时间限制:1秒
空间限制:32768K
牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列。注意,子序列不要求在原字符串中是连续的,例如串 abc,它的子序列就有 {空串, a, b, c, ab, ac, bc, abc} 8 种。
输入描述:
每个输入包含一个测试用例。每个测试用例包含两行长度不超过 10 的不包含空格的可见 ASCII 字符串。

输出描述:
输出一行 “Yes” 或者 “No” 表示结果。

输入例子1:
x.nowcoder.com
ooo

输出例子1:
Yes

#coding=utf-8

import math

while True:
    try:
        s=raw_input().strip()
        t=raw_input().strip()
        temp=0
        for i in t:
            if i in s:
                ind=s.index(i)
                s=s[ind+1:]
            else:
                temp=1
                break
        if temp==0:
            print 'Yes'
        else:
            print 'No'
    except:
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值