牛客6

来源:互联网 发布:淘宝群词荟萃 编辑:程序博客网 时间:2024/05/22 00:09

[编程题] 迷宫寻路

时间限制: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-8class node:    def __init__(self,x,y,k,step):        self.x=x        self.y=y        self.k=k        self.step=stepdef 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 0while 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-8while 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-8import sysa=[]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-8while 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-8import mathwhile 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-8import mathwhile 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
原创粉丝点击