3108 小明愛換錢

2021-10-05 22:45:50 字數 1188 閱讀 3447

第一行中的兩個整數n, m (1 <= n <= 10^5, 1 <= m <= 10^9)表示可用交換的數量和最終金錢的期望值。

接下來是n行,每一行描述乙個有3個整數vi, ri, ti (1 <= ri <= vi <= 10^9, 1 <= ti <= 10^9)的交換。

輸出乙個數字,表示最少花費時間,如果不可以完成任務,輸出"-1".
對於10%的資料,1<= n <= 8, 1 <= m <= 10^9

對於50%的資料,1 <= n<= 1024, 1 <= m <= 10^9

對於100%的資料,1 <= n <= 100000, 1 <= m <= 10^9

1 <= ri <= vi <= 10^9, 1 <= ti <= 10^9

先說一下最初的錯誤思路:

把每一條輸入資料看做乙個節點,如果節點a的vi大於另外其他任何節點b的ri值,則在a和b之間建立一條邊,權值為兌換b所需要的的時間ti,以最初的價值1為起點建圖,跑單源最短路,找到既返回。

是的這個方法的思路按理說是沒錯的,但是實際上節點相互之間建立的邊實在是太多了。最後幾組資料全部超空間。

正解:跑單源最短路

有同學要問了,不是說是錯誤的思路嗎?是的,那麼優化就是,雖然還是跑最短路,但是邊是不需要儲存起來的,這樣就不會有超空間的問題了。

那麼在這道題中我們也在最小堆中維護乙個節點node(value,spend)鍵值是spend,這樣每次都從堆頂拿到花費最小的節點,以此為跳板遍歷所有資料,判斷節點的v和資料堆中資料的r判斷可否更新,可以更新的話則在堆中加入新的更新資料,如此當堆頂出現第乙個value符合條件的節點,那麼speed必然是最小的。

如下:

#include#include#include#include#includeusing namespace std;

const int max_size=100005;

struct node

bool operator < (const node &r)const

};int v[max_size];

int r[max_size];

int t[max_size];

int main()

for(int i=0;i=r[i])}}

printf("%d\n",ans);

return 0;

}

愛摘蘋果的小明

描述 小明家的院子裡有一棵蘋果樹,每到秋天樹上就會結出10個蘋果。蘋果成熟的時候,小明就會跑去摘蘋果。小明有個30厘公尺高的板凳,當她不能直接用手摘到蘋果的時候,就會踩到板凳上再試試。現在已知10個蘋果到地面的高度,以及小明把手伸直的時候能夠達到的最大高度,請幫小明算一下她能夠摘到的蘋果的數目。假設...

愛摘蘋果的小明

描述 小明家的院子裡有一棵蘋果樹,每到秋天樹上就會結出10個蘋果。蘋果成熟的時候,小明就會跑去摘蘋果。小明有個30厘公尺高的板凳,當她不能直接用手摘到蘋果的時候,就會踩到板凳上再試試。現在已知10個蘋果到地面的高度,以及小明把手伸直的時候能夠達到的最大高度,請幫小明算一下她能夠摘到的蘋果的數目。假設...

愛摘蘋果的小明

描述 小明家的院子裡有一棵蘋果樹,每到秋天樹上就會結出10個蘋果。蘋果成熟的時候,小明就會跑去摘蘋果。小明有個30厘公尺高的板凳,當她不能直接用手摘到蘋果的時候,就會踩到板凳上再試試。現在已知10個蘋果到地面的高度,以及小明把手伸直的時候能夠達到的最大高度,請幫小明算一下她能夠摘到的蘋果的數目。假設...