題目描述:
為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標準來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好把這個任務交給了你。
輸入:
每個輸入包含乙個測試用例。輸出:每個測試用例的第一行包含兩個正整數,分別表示工作的數量n(n<=100000)和小夥伴的數量m(m<=100000)。
接下來的n行每行包含兩個正整數,分別表示該項工作的難度di(di<=1000000000)和報酬pi(pi<=1000000000)。
接下來的一行包含m個正整數,分別表示m個小夥伴的能力值ai(ai<=1000000000)。
保證不存在兩項工作的報酬相同。
對於每個小夥伴,在單獨的一行輸出乙個正整數表示他能得到的最高報酬。乙個工作可以被多個人選擇。這題如果用兩個內嵌for迴圈就會超時間。 按報酬排序也超時間。
題解:用字典儲存難度、報酬,同時把能力也當做鍵加入。按照能力從小到大排序,這樣只需要和前面能力值小的所獲最大報酬比較。(能力值大的報酬只會大於或者等於能力低的)
import sys
def main():
lines = sys.stdin.readlines()
lines = [l.strip().split() for l in lines if l.strip()]
n, m = int(lines[0][0]), int(lines[0][1])
res = [0]*(m+n)
abilities = list(map(int, lines[-1]))
maps = dict()
for index,l in enumerate(lines[1:-1]):
d,p = int(l[0]), int(l[1])
maps[d] = p
res[index] = d
for index,a in enumerate(abilities):
if a not in maps:
maps[a] = 0
res[index+n] = a
res.sort()
maxsalary = 0
for i in range(n+m):
maxsalary = max(maxsalary,maps[res[i]]) #只需要跟前面能力較低的最大薪水比較
maps[res[i]] = maxsalary
for i in range(m):
print(maps[abilities[i]])
if __name__ == '__main__':
main()
感觸:這題挺難的。。。 牛客網 牛牛找工作
時間限制 2秒 空間限制 65536k 為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標 准來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好...
牛客網 牛牛的數列
題目描述 牛牛現在有乙個n個數組成的數列,牛牛現在想取乙個連續的子串行,並且這個子串行還必須得滿足 最多隻改變乙個數,就可以使得這個連續的子串行是乙個嚴格上公升的子串行,牛牛想知道這個連續子串行最長的長度是多少。一開始看到這個題,總是被繞進 改變乙個數 中,就想說是不是遍歷陣列,然後每個數都嘗試改變...
牛客網 牛牛打怪獸
題目描述 題意身為屯里第一劍士的牛牛來到訓練場裡闖關,由於過於勤奮,牛牛的寶劍的耐久度降到了 22 這意味著牛牛最多只能打倒兩隻怪獸,否則將會被淘汰。訓練場的地圖可以看作一棵以 11 為根節點的樹,訓練場的終點為這棵樹的葉子結點,樹上的每個結點最多有乙隻怪獸,結點與結點間的邊上沒有怪獸。每乙個有怪獸...