力扣 LCP08劇情觸發時間

2021-10-08 23:31:03 字數 3195 閱讀 6804

題目描述

在戰略遊戲中,玩家往往需要發展自己的勢力來觸發各種新的劇情。乙個勢力的主要屬性有三種,分別是文明等級(c),資源儲備(r)以及人口數量(h)。在遊戲開始時(第 0 天),三種屬性的值均為 0。

隨著遊戲程序的進行,每一天玩家的三種屬性都會對應增加,我們用乙個二維陣列 increase 來表示每天的增加情況。這個二維陣列的每個元素是乙個長度為 3 的一維陣列,例如 [[1,2,1],[3,4,2]] 表示第一天三種屬性分別增加 1,2,1 而第二天分別增加 3,4,2。

所有劇情的觸發條件也用乙個二維陣列 requirements 表示。這個二維陣列的每個元素是乙個長度為 3 的一維陣列,對於某個劇情的觸發條件 c[i], r[i], h[i],如果當前 c >= c[i] 且 r >= r[i] 且 h >= h[i] ,則劇情會被觸發。

根據所給資訊,請計算每個劇情的觸發時間,並以乙個陣列返回。如果某個劇情不會被觸發,則該劇情對應的觸發時間為 -1 。

示例 1:

輸入: increase = [[2,8,4],[2,5,0],[10,9,8]] requirements = [[2,11,3],[15,10,7],[9,17,12],[8,1,14]]

輸出: [2,-1,3,-1]

解釋:初始時,c = 0,r = 0,h = 0

第 1 天,c = 2,r = 8,h = 4

第 2 天,c = 4,r = 13,h = 4,此時觸發劇情 0

第 3 天,c = 14,r = 22,h = 12,此時觸發劇情 2

劇情 1 和 3 無法觸發。

示例 2:

輸入: increase = [[0,4,5],[4,8,8],[8,6,1],[10,10,0]] requirements = [[12,11,16],[20,2,6],[9,2,6],[10,18,3],[8,14,9]]

輸出: [-1,4,3,3,3]

示例 3:

輸入: increase = [[1,1,1]] requirements = [[0,0,0]]

輸出: [0]

解題思路

一開始拿到這道題,心想這不是挺簡單嗎,外層乙個迴圈用來累加increase,然後每累加一次,就在requirements裡面迴圈找出滿足條件得,事實證明,想得太天真了!中等難度得題目這麼好想怎麼可能,結果超時了。

看了別人大佬得解法,才覺得恍然大悟,用二分法來查詢速度會更快,開始先一層迴圈儲存increase所有可能的結果,然後遍歷requirements每乙個元素,在實現儲存好的結果中使用二分查詢。

**1是暴力解法(超時):

class solution(object):

def oncondi(self, a, b):

for i in range(len(a)):

if a[i] < b[i]:

return false

return true

def calplus(self, a, b):

for i in range(len(a)):

a[i] += b[i]

return a

def gettriggertime(self, increase, requirements):

increase.insert(0, [0] * len(increase[0]))

res = [-1] * len(requirements)

cur = [0] * len(increase[0])

for i in range(len(increase)):

cur = self.calplus(cur, increase[i])

for j in range(len(requirements)):

if self.oncondi(cur, requirements[j]):

if res[j] == -1:

res[j] = i

return res

s = solution()

print(s.gettriggertime([[2,8,4],[2,5,0],[10,9,8]], [[2,11,3],[15,10,7],[9,17,12],[8,1,14]]))

**1中gettriggertime函式兩層迴圈已經很恐怖了,特別是1 <= increase.length <= 10000, 1 <= requirements.length <= 100000,兩層迴圈進行10億次計算,必定超時

**2是二分解法:

from copy import deepcopy

class solution(object):

def calplus(self, a, b):

temp = deepcopy(a)

for i in range(len(a)):

temp[i] += b[i]

return temp

def gettriggertime(self, increase, requirements):

res = [-1] * len(requirements)

forces = [[0, 0, 0]]

for i in range(len(increase)):

for i, requirement in enumerate(requirements):

left, right = 0, len(forces) - 1

while left <= right:

mid = left + (right - left) // 2

if requirement[0] <= forces[mid][0] and requirement[1] <= forces[mid][1] and requirement[2] <= forces[mid][2]:

res[i] = mid

right = mid - 1

else:

left = mid + 1

return res

s = solution()

print(s.gettriggertime([[2,8,4],[2,5,0],[10,9,8]], [[2,11,3],[15,10,7],[9,17,12],[8,1,14]]))

**2中第一層for迴圈首先儲存結果,這個時間複雜度比較小,儘管後面也是二層迴圈(for和while),但是while裡面是二分查詢,節省了大量的迴圈時間,所以比**1快不少

力扣 LCP22 黑白方格畫

小釦注意到秋日市集上有乙個創作黑白方格畫的攤位。攤主給每個顧客提供乙個固定在牆上的白色畫板,畫板不能轉動。畫板上有 n n 的網格。繪畫規則為,小釦可以選擇任意多行以及任意多列的格仔塗成黑色,所選行數 列數均可為 0。小釦希望最終的成品上需要有 k 個黑色格仔,請返回小釦共有多少種塗色方案。注意 兩...

0 力扣每日一題

題目傳送門 這題我的思路比較簡單.簡明表示如下 作用 初始化鍊錶,使得之後每次在鍊錶尾部新增元素都變得完全一樣,很大程度減少了 量.包含在標頭檔案queue中,可以方便地維護乙個有一定優先順序的佇列,也就是堆.定義有三個引數 資料 容器 用陣列實現的容器,包含vector deqeue,不包含lis...

力扣 1658 將 x 減到 0 的最小運算元

題目描述 示例 1 輸入 nums 1 1,4 2,3 x 5輸出 2 解釋 最佳解決方案是移除後兩個元素,將 x 減到 0 示例 2 輸入 nums 5 6,7 8,9 x 4輸出 1示例 3 輸入 nums 3 2,20 1,1 3 x 10輸出 5 解釋 最佳解決方案是移除後三個元素和前兩個元...