五题代码分别过了 100 83.33 100 20 54.54
前三题简单,第四题是真的难,第五题也蛮难的。。
第一题:游戏里面的一个机制是死亡后金币减半(取天棚计算),求角色死亡N次后的金币剩余量
简单题 不说了
import math
t=int (input())
dict={}
for i in range(t):
list=[0]*2
list=[int (i) for i in input().split()]
dict[i]=list
for i in range(t):
for j in range(dict[i][1]): #death time
dict[i][0]=math.ceil(dict[i][0]/2)
print(dict[i][0])
第二题:
扑克排序 A~K分别对应1~13的权重 四种花色对应(d:0,c:13,h:26,s:39)四个权重,一张牌的权重由扑克的点数和花数相加决定比如3 d的权重就是3
现在输入n张扑克,要从权重从小到大排序,并且连续的权重只留首尾两张牌,不连续的就保留,然后输出最后的扑克序列
我的思路就是直接暴力搞,先放两个字典存两个权重,然后依次输入扑克的时候就再建一个字典,存每一个扑克的初始位置和权重(因为最后的输出排序是和最开始的不一样的,所以需要一个字典记录位置),然后对输入扑克列表排序,第一张和最后一张一定保留,中间的扑克,如果它的值不等于前面的+1或者后面的-1就保留(说明他是单牌或者是连续序列的首尾)。最后在保留下来的扑克里面依次去字典里找对应的扑克和花色
这里要注意,因为它扑克权重是1~13 花色权重是0 13 26 39,这样可以保证任何一张牌的权重都不一样(从1d~Ks正好是1~52),所以可以放心地建字典找
但是我只过了83.33.。有个例子不知道是啥没过
还有就是我这字典有可能建反了,其实我感觉最好的方法是可以在最后那个字典里面用二分来查的,我就是最开始准备二分来查,结果发现不行,我想错了。。。
dict_poke={'A':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':11,'Q':12,'K':13}
dict_color={'d':0,'c':13,'h':26,'s':36}
n=int(input())
list=[]
for i in range(n):
list.append(input().split())
dict_value={}
sort_list=[]
for i in range(n):
dict_value[i]=dict_poke[list[i][0]]+dict_color[list[i][1]]
sort_list.append(dict_poke[list[i][0]]+dict_color[list[i][1]]) #用于排序
sort_list.sort()
final_list=[sort_list[0]]
for i in range(1,len(sort_list)-1):
if sort_list[i]-1 != sort_list[i-1]&nbs***bsp;sort_list[i]+1 != sort_list[i+1]:
final_list.append(sort_list[i])
final_list.append(sort_list[-1])
for i in range(len(final_list)):
for j in range(len(dict_value)):
if dict_value[j]==final_list[i]:
print(list[j][0],list[j][1])
第三题:
有n个帮派,帮派里面的人数量不定,每个人都有一个战斗值,现在要从全部人里面选出战斗值前k大的人出来决战,输出按逆序
topK问题,维护一个节点数为k的最小堆就可以了
具体看代码
对了 这里有个问题是因为每个帮派的人数量不一定,所以说整个二维数组里面的有些值是空的,刚才有个人问我为啥数组总越界估计就是这里出了问题,遍历每一行(就是每个帮派)的时候要重新计算这一行的列数(就是这个帮派的人数),我当时在这里也搞了蛮久。。
import heapq
k,n=input().split()
k=int(k)
n=int(n)
list=[]
for i in range(n):
list.append(input().split())
heap=[]
heapq.heapify(heap)
row=len(list)
#col=len(list[i]) 不能放这里
for i in range(row):
col=len(list[i])
for j in range(col):
if not list[i][j]:
continue
list[i][j]=int(list[i][j])
if len(heap)
heapq.heappush(heap,list[i][j])
elif list[i][j] >heap[0]:
heapq.heapreplace(heap,list[i][j])
heap.sort(reverse=True)
for i in heap:
print(i,end=" ") 第四题:
给一堆点给你叫你求这些点的对称坐标。。。我是真的不会求,四个点两条线我会手算,N个点我是真的不会,需要一个数学大佬出来教教我们。最后我随便搞了个点数比较少的做法过了一个例子(20%)。。。
第五题:
就是三个字符串之间的LCS(最长公共子串问题),两个字符串之间直接动态规划就行,算法导论那本书里面有,网上也一大堆讲解的,这里我就不讲了。但是三个字符串我又懵了。。最后我就把写了个两个字符串之间的LCS函数,然后把三个字符串两两放进去比,然后输出他们那三个最长公共子串中最短的一个,这样做明显是有问题的,因为我返回的其实还是其中两个字符串的LCS,这并不代表另一个字符串也有相同的公共子串。最后这个方法骗了54.54,还算蛮幸运,我想过用一个字典存一下两个字符串之间的公共子串及其长度,发现实现起来有点困难。。。希望有大佬放出来ac的代码