2018-10-09,22点58
#下面这一段用一个txt来保存input的信息来模拟input.最后提交代码时候删除这一段即可. a9999=open(‘1.txt‘,‘r‘) def input(): return a9999.readline().rstrip(‘\n‘) #输入数据的一些模板 # n,a=map(int,input().split()) # arr=[int(i)for i in input().split()] # 格式化输出 # print(‘%.2f‘%(maxi/2)) ‘‘‘ # 最大公约数用 import fractions fractions.gcd(a,b) ‘‘‘ ‘‘‘ [编程题] 小易的升级之路 时间限制:1秒 空间限制:32768K #小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少? 输入描述: 对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 第二行n个整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御力 import fractions while 1:#处理多段不知道多少的输入用这个方法死循环+内层try except break套路 try: now=input() if now==‘‘: break n,a=map(int,now.split()) for i in range((n)): b=int(input()) if b<=a: a+=b else: a+=fractions.gcd(a,b) print(a) except: break ‘‘‘ ‘‘‘ [编程题] 炮台攻击 时间限制:1秒 空间限制:32768K 兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格------约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并且给出敌人 的坐标. 问:那么敌人受到伤害会是多大? 输入描述: 第一行9个整数,R,x1,y1,x2,y2,x3,y3,x0,y0.R代表炮台攻击的最大距离,(x1,y1),(x2,y2), (x3,y3)代表三个炮台的坐标.(x0,y0)代表敌人的坐标. 输出描述: 输出一行,这一行代表敌人承受的最大伤害,(如果每个炮台都不能攻击到敌人,输出0×) 输入例子1: 1 1 1 2 2 3 3 1 2 输出例子1: 2x while 1: try: r,x1,y1,x2,y2,x3,y3,x0,y0=map(int,input().split()) count=0 if ((x1-x0)**2+(y1-y0)**2)**0.5<=r: count+=1 if ((x2-x0)**2+(y2-y0)**2)**0.5<=r: count+=1 if ((x3-x0)**2+(y3-y0)**2)**0.5<=r: count+=1 print(str(count)+‘x‘) except: break ‘‘‘ ‘‘‘ https://www.nowcoder.com/test/question/fe6c73cb899c4fe1bdd773f8d3b42c3d?pid=970447&tid=19242023 牛客网的网站有问题,搜索试卷是出不来的,只能按照连接点进去才行. [编程题] 扫描透镜 时间限制:1秒 空间限制:32768K 在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇? 注意:每个方格被扫描一次只能清除掉一个蘑菇。 输入描述: 第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小; 接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇. 一个方格可以种无穷个蘑菇. 输出描述: 输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇. 扫描2次,每一次都找最多的那个3*3进行轰炸即可 地图问题都先加一圈边界,边界上炸弹设置数量为0 #这题目虽然简单,但学到了很多地图上的技巧 while 1: try: n,m,k=map(int,input().split()) save=[[0]*(m+2) for i in range(n+2)] for i in range((k)): a,b=map(int,input().split()) save[a][b]+=1 def search(i,j): #返回save上i,j位置3*3内有多少个地方有地雷 count=0 #先把转移坐标写成列表 arr=[(-1,-1),(-1,0),(-1,1),(0,-1),(0,0),(0,1),(1,-1),(1,0),(1,1)] for _ in range(len(arr)): newdex=i+arr[_][0],j+arr[_][1] if save[newdex[0]][newdex[1]]>0: count+=1 return count def jian(i,j): #清楚save上i,j位置3*3内每一个地方的一个地雷 #先把转移坐标写成列表 arr=[(-1,-1),(-1,0),(-1,1),(0,-1),(0,0),(0,1),(1,-1),(1,0),(1,1)] for _ in range(len(arr)): newdex=i+arr[_][0],j+arr[_][1] if save[newdex[0]][newdex[1]]>0: save[newdex[0]][newdex[1]]-=1 #地图实际范围是从1到n 从1到m maxi=0 for i in range(1,(n+1)): for j in range(1,(m+1)): if search(i,j)>maxi: now=i,j maxi=search(i,j) jian(now[0],now[1]) maxi2=0 for i in range((n+1)): for j in range((m+1)): if search(i,j)>maxi2: now=i,j maxi2=search(i,j) print(maxi+maxi2) except: break ‘‘‘ ‘‘‘ https://www.nowcoder.com/test/question/cee98a512ec246a2918ea8121f7612c8?pid=710847&tid=19243264 [编程题] 奖学金 时间限制:1秒 空间限制:32768K 小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。 输入描述: 第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1 输出描述: 一行输出答案。 输入例子1: 5 10 9 0 5 9 1 8 1 0 1 9 100 输出例子1: 43 应该是贪心法.从收益最高的开始学习 while 1: try: n,r,avg=map(int,input().split()) save=[] for i in range((n)): save.append([int(i)for i in input().split()][::-1]) needall=avg*n save.sort() now=0 for i in range(len(save)): now+=save[i][1] #print(now)#目前总分 study=0 for i in range(len(save)): if now<needall: if now+r-save[i][1]<=needall: study+=save[i][0]*(r-save[i][1]) now+=r-save[i][1] else: study+=save[i][0]*(needall-now) now+=needall-now else: break print(study) except: break ‘‘‘ ‘‘‘ https://www.nowcoder.com/question/next?pid=710847&qid=26023&tid=19243264 [编程题] 路灯 时间限制:1秒 空间限制:32768K ........................... 0 a1 a2 1 一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai ,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要使这个d最小,请找到这个最小的d。 输入描述: 每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。 输出描述: 输出答案,保留两位小数。 输入例子1: 7 15 15 5 3 7 9 14 0 输出例子1: 2.50 排序后间距相邻的间距最远的两个灯的距离除以2即可. while 1: try: n,l=map(int,input().split()) arr=[int(i)for i in input().split()] arr.sort() maxi=0 for i in range(len(arr)-1): if arr[i+1]-arr[i]>maxi: maxi=arr[i+1]-arr[i] maxi=maxi/2 if 0 not in arr: first=arr[0]-0 maxi=max(maxi,first) if l not in arr: end=l-arr[-1] maxi=max(maxi,end) print(‘%.2f‘%(maxi)) except: break ‘‘‘ ‘‘‘ [编程题] 牛牛找工作 时间限制:2秒 空间限制:65536K 为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。 输入描述: 每个输入包含一个测试用例。 每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。 接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。 接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。 保证不存在两项工作的报酬相同。 输出描述: 对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。 输入例子1: 3 3 1 100 10 1000 1000000000 1001 9 10 1000000000 输出例子1: 100 1000 1001 1 把工作按照难度升序排列,然后数组的第二列是收入,收入里面如果有降序的就删除后面这一项. 用2分为每一个人找工作 ‘‘‘ ‘‘‘ [编程题] 被3整除 时间限制:1秒 空间限制:32768K 小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。 数列是:0 1 1 0 1 1 011................. 显然是011循环的.所以根据r直接就能算1到r有多少个被3整除的数 并且小Q对于能否被3整除这个性质很感兴趣。 小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。 输入描述: 输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。 输出描述: 输出一个整数, 表示区间内能被3整除的数字个数。 输入例子1: 2 5 输出例子1: 3 例子说明1: 12, 123, 1234, 12345... 其中12, 123, 12345能被3整除。 l,r =map(int,input().split()) left=r %3 if left==1: left=0 if left==2: left=1 daor=r//3*2+left left=(l-1) %3 if left==1: left=0 if left==2: left=1 daol=(l-1)//3*2+left print(daor-daol) ‘‘‘ ‘‘‘ [编程题] 安置路灯 时间限制:1秒 空间限制:32768K 小Q正在给一条长度为n的道路设计路灯安置方案。 为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用‘.‘表示, 不需要照亮的障碍物格子用‘X‘表示。 小Q现在要在道路上设置一些路灯, 对于安置在pos位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1这三个位置。 小Q希望能安置尽量少的路灯照亮所有‘.‘区域, 希望你能帮他计算一下最少需要多少盏路灯。 输入描述: 输入的第一行包含一个正整数t(1 <= t <= 1000), 表示测试用例数 接下来每两行一个测试数据, 第一行一个正整数n(1 <= n <= 1000),表示道路的长度。 第二行一个字符串s表示道路的构造,只包含‘.‘和‘X‘。 输出描述: 对于每个测试用例, 输出一个正整数表示最少需要多少盏路灯。 输入例子1: 2 3 .X. 11 ...XX....XX 输出例子1: 1 3 算法:遇到.就用一个灯放在这个.的后面.所以当前位置就+3 遇到x就不放灯,直接位置+1.不好说清楚为什么这么放最少. n=int(input()) for i in range((n)): chang=int(input()) lu=input() dex=0 count=0 while dex<len(lu): if lu[dex]==‘.‘: count+=1 dex+=3 else: dex+=1 print(count) ‘‘‘ ‘‘‘ [编程题] 迷路的牛牛 时间限制:1秒 空间限制:32768K 牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。 输入描述: 每个输入包含一个测试用例。 每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。 接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。 输出描述: 输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。 输入例子1: 3 LRR 输出例子1: E n=int(input()) a=input() arr=‘NESW‘ count=0 for i in range(len(a)): if a[i]==‘L‘: count-=1 else: count+=1 count=(count+4*abs(count))%4 print(arr[count]) ‘‘‘ ‘‘‘ [编程题] 数对 时间限制:1秒 空间限制:32768K 牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。 但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。 牛牛希望你能帮他计算一共有多少个可能的数对。 输入描述: 输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。 输出描述: 对于每个测试用例, 输出一个正整数表示可能的数对数量。 输入例子1: 5 2 5 3 y一定大于k (3,4) (3,5) (4,5) 输出例子1: 7 例子说明1: 满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3) Python3(3.5.2)重置自测 1 ?不会: 答案: def find_pairs(): n, k = map(int, raw_input().split()) cnt = 0 if k == 0: return pow(n, 2) for i in range(k + 1, n+1): //表示每i个数会出现一些需要的数,最后加上尾巴即可. cnt += n // i * (i - k) + (n % i - k + 1 if n % i >= k else 0) return cnt print find_pairs() ‘‘‘ ‘‘‘ https://www.nowcoder.com/question/next?pid=9763997&qid=152612&tid=19266166 [编程题] 矩形重叠 时间限制:1秒 空间限制:32768K 平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。 如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。 请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。 输入描述: 输入包括五行。 第一行包括一个整数n(2 <= n <= 50), 表示矩形的个数。 第二行包括n个整数x1[i](-10^9 <= x1[i] <= 10^9),表示左下角的横坐标。 第三行包括n个整数y1[i](-10^9 <= y1[i] <= 10^9),表示左下角的纵坐标。 第四行包括n个整数x2[i](-10^9 <= x2[i] <= 10^9),表示右上角的横坐标。 第五行包括n个整数y2[i](-10^9 <= y2[i] <= 10^9),表示右上角的纵坐标。 输出描述: 输出一个正整数, 表示最多的地方有多少个矩形相互重叠,如果矩形都不互相重叠,输出1。 输入例子1: 2 0 90 0 90 100 200 100 200 输出例子1: 2 把每一个矩阵的4个边都看成4条无限长直线. 最后需要的区域一定是被4条直线加起来的区域. 别人答案: import sys lines = sys.stdin.readlines() n = int(lines[0]) x1 = list(map(int,lines[1].split())) y1 = list(map(int,lines[2].split())) x2 = list(map(int,lines[3].split())) y2 = list(map(int,lines[4].split())) res = 1 for x in x1+x2:#所有的横坐标切分点 for y in y1+y2:#所有的纵坐标切分店 cnt = 0 for i in range(n): #在所有的横纵切分点里面,如果这个切分点在当前矩阵在内部就让这个切分点的cnt+1 if x > x1[i] and y > y1[i] and x <= x2[i] and y <= y2[i]: cnt += 1 res = max(res,cnt) print(res) 或者: import sys lines = sys.stdin.readlines() n = int(lines[0]) x1 = list(map(int,lines[1].split())) y1 = list(map(int,lines[2].split())) x2 = list(map(int,lines[3].split())) y2 = list(map(int,lines[4].split())) res = 1 for x in x1+x2:#所有的横坐标切分点 for y in y1+y2:#所有的纵坐标切分店 cnt = 0 for i in range(n): #在所有的横纵切分点里面,如果这个切分点在当前矩阵在内部就让这个切分点的cnt+1 #就是下面的判定需要一个是大于等于一个是小于也可以.就是保证矩阵相交点,边时候不算相交 if x >= x1[i] and y >= y1[i] and x <x2[i] and y < y2[i]: cnt += 1 res = max(res,cnt) print(res) ‘‘‘ ‘‘‘ [编程题] 牛牛的背包问题 时间限制:1秒 空间限制:32768K 牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。 牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。 牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。 输入描述: 输入包括两行 第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。 第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。 输出描述: 输出一个正整数, 表示牛牛一共有多少种零食放法。 输入例子1: 3 10 1 2 4 输出例子1: 8 例子说明1: 三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。 n,w=map(int,input().split()) arr=[int(i)for i in input().split()] def cnt(arr,w): if arr==[]: return 1 if arr[0]<=w: tmp=arr[:] tmp.pop(0) return cnt(tmp,w)+cnt(tmp,w-arr[0]) if arr[0]>w: tmp=arr[:] tmp.pop(0) return cnt(tmp,w) if sum(arr)<=m:#这个题目需要用这个公式来加速 print(2**len(arr)) else: print(cnt(arr,w)) 别人代码:写的逼我简介,主要是空间消耗逼我的少,看这个改我的上面代码 line = raw_input() n = int(line.split(‘ ‘)[0]) w = int(line.split(‘ ‘)[1]) line = raw_input() v = [] for i in range(n): v.append(int(line.strip().split(‘ ‘)[i])) ans = 0 def main(v, w): global ans if sum(v) <= w: print 2**(len(v)) else: v.sort() dfs(0, 0) print ans def dfs(su, loc):#看这个是怎么设计的递归函数 #这个函数第一个是目前的重量,第二个是当前在v中的index global ans if su > w: return if su <= w: ans += 1 for i in range(loc, n):#表示如果当前重量没超过w,那么嗨可以继续放后面index中的一个.继续判断 #这个递归函数写的,充分避免了数组的使用和数组重复的复制,只用下表就表示了数组的变化 dfs(su+v[i], i+1) main(v, w) ‘‘‘ ‘‘‘ https://www.nowcoder.com/test/question/32c71b52db52424c89a565e4134bfe4e?pid=6910869&tid=19267265 [编程题] 魔法币 时间限制:1秒 空间限制:32768K 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。 魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币 小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。 输入描述: 输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。 输出描述: 输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符‘1‘和‘2‘。 输入例子1: 输出例子1: 122 分析知道,第一个机器出来的一定是奇数 第二个机器出来的一定是偶数.所以根据最后需要的硬币,倒着推即可 a=int(input()) ans=‘‘ while a!=0: if a%2==0: ans+=‘2‘ a=(a-2)//2 else: ans+=‘1‘ a=(a-1)//2 print(ans[::-1]) ‘‘‘ ‘‘‘ [编程题] 相反数 时间限制:1秒 空间限制:32768K 为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到1325的"相反数",首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1. 输入描述: 输入包括一个整数n,(1 ≤ n ≤ 10^5) 输出描述: 输出一个整数,表示n的相反数 输入例子1: 1325 输出例子1: 6556 a=int(input()) print(a+int(str(a)[::-1])) ‘‘‘ ‘‘‘ [编程题] 字符串碎片 时间限制:1秒 空间限制:32768K 一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:‘aaa‘,‘bb‘,‘c‘。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。 输入描述: 输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s只含小写字母(‘a‘-‘z‘) 输出描述: 输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。 如样例所示: s = "aaabbaaac" 所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25 输入例子1: aaabbaaac 输出例子1: 2.25 a=input() cnt=[] first=0 for i in range(1,len(a)): if a[i]!=a[i-1]: cnt.append(i-first) first=i cnt.append(len(a)-first) print(‘%.2f‘%(sum(cnt)/len(cnt))) ‘‘‘ ‘‘‘ https://www.nowcoder.com/question/next?pid=6910869&qid=126950&tid=19267265 [编程题] 游历魔法王国 时间限制:1秒 空间限制:32768K 魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。 小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。 如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。 输入描述: 输入包括两行,第一行包括两个正整数n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市个数和小易能行动的次数。 第二行包括n-1个整数parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接。 输出描述: 输出一个整数,表示小易最多能游历的城市数量。 输入例子1: 5 2 0 1 2 3 输出例子1: 3 ‘‘‘
原文:https://www.cnblogs.com/zhangbo2008/p/9763712.html