題目一:金幣
分析:動態規劃,從上到下,算出每個位置能得到的最大值
n=
int(
input()
)nums=
for i in
range
(n):
tmp=
list
(map
(int
,input()
.split(
' ')))
if n==1:
print
(nums[0]
[0])
pre=
[nums[0]
[0]]
cur=
for i in
range(1
,n):
for j in
range
(len
(pre)):
ifnot cur:
+nums[i]
[j])
+nums[i]
[j+1])
else
: tmp=pre[j]
+nums[i]
[j]if cur[-1
]cur[-1
]=tmp
+nums[i]
[j+1])
pre=cur
cur=
ans=
0for i in
range
(len
(pre)):
if pre[i]
>ans:
ans=pre[i]
print
(ans)
題目二:交換座位
注意:不一定需要公升序排列
暴力解法:
分析:遍歷每乙個2i位置上的元素,看2i+1位置上的陣列符不符合要求,不符合的話,找到正確的數,兩數進行交換
cnt=
0for i in
range(0
,2*n,2):
if row[i]%2
==0and row[i+1]
==row[i]+1
:continue
elif row[i]%2
==0and row[i+1]
!=row[i]+1
: index=row.index(row[i]+1
) row[i+1]
,row[index]
=row[index]
,row[i+1]
cnt+=
1elif row[i]%2
==1and row[i+1]
==row[i]-1
:continue
elif row[i]%2
==1and row[i+1]
!=row[i]-1
: index=row.index(row[i]-1
) row[i+1]
,row[index]
=row[index]
,row[i+1]
cnt+=
1print
(cnt)
提交會超時。也是意料之中。每次都去尋找正確數的位置,時間複雜度會到n的平方量級
優化解法:
分析:用乙個額外的陣列pos,將每個數字的位置存起來
n=
int(
input()
)row=
list
(map
(int
,input()
.split(
' ')))
pos=[0
for i in
range(2
*n)]
for i in
range(2
*n):
pos[row[i]]=i
cnt=
0for i in
range(0
,2*n,2):
if row[i]%2
==1: y=row[i]-1
else
: y=row[i]+1
if row[i+1]
!=y:
pos[row[i+1]
]=pos[y]
row[pos[y]
]=row[i+1]
row[i+1]
=y pos[y]
=i+1
cnt+=
1print
(cnt)
這是一種用空間換時間的優化思路。
題目三:修塔遊戲
非常規思路:類貪心演算法
n,k=
map(
int,
input()
.split(
' ')
)hights=
list
(map
(int
,input()
.split(
' ')))
hights.sort(
)res1=
0res2=
0for i in
range
(k):
res1+=
(hights[k-1]
-hights[i]
)#小於第k個值的數都補齊到hights[k-1]
res2+=
(hights[n-
1-i]
-hights[n-k]
)#大於第n-k個值的數都補齊到hights[n-k]
index1=k
index2=n-k-
1while index1
if hights[index1]
==hights[k-1]
:#k-1之後還有等於hights[k-1]的數,前面就可以減少
index1+=
1 res1-=
1else
:break
while index2>=0:
if hights[index2]
==hights[n-k]
: index2-=
1 res2-=
1else
:break
ans=
max(0,
min(res1,res2)
)print
(ans)
招行春招第三題
題意 有n個桌腿,要砍掉某些桌腿使得剩下的桌腿能支撐桌子。規定剩下的桌腿中長度最大的桌腿的數量如果超過一半即可支撐桌子。砍掉每個桌腿需要付出代價。求最小的代價和。原題 首先,按長度排序。長度為p的桌腿有a p 個。要使得長度為p的桌腿為最長,1 將所有長於p的桌腿砍光 2 那麼要按照代價從小到大砍掉...
招行FT訓練營筆試第二題題解
招行筆試第二題是leetcode第765題 情侶牽手。這題要求最少移動個數,我們通過貪心演算法來解決。貪心演算法即為先通過交換讓第一對情侶在一起,然後在看第二對,依次遍歷所有資料。對本題來講,每組數是較小的偶數和大1的奇數,兩者位置可互換。所以解題時,我們先判別每組的第乙個數是偶數還是奇數。如果是偶...
演算法 常見演算法題
演算法題 假如有100個不相同的數,比如從1到100,怎樣使用10次取出其中的10個不同的數字,要求每個數取出的概率一樣 一開始沒有說10次,所以我說,使用乙個random函式,以時間為種子來取,當取出乙個時,做標記,下次再取到這個數時,重新取一次 然後他就說了如果只能夠取10次怎麼辦?一開始我想到...