第一行中的兩個整數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個蘋果到地面的高度,以及小明把手伸直的時候能夠達到的最大高度,請幫小明算一下她能夠摘到的蘋果的數目。假設...