51nod 1307 繩子與重物 二分 dfs

2021-08-10 20:19:48 字數 1267 閱讀 8025

有n條繩子編號 0 至 n - 1,每條繩子後面栓了乙個重物重量為wi,繩子的最大負重為ci。每條繩子或掛在別的繩子下或直接掛在鉤子上(編號-1)。如果繩子下所有重物的重量大於繩子的最大負重就會斷掉(等於不會斷)。依次給出每條繩子的負重ci、重物的重量wi以及繩子會掛在之前的哪條繩子的下面,問最多掛多少個繩子而不會出現繩子斷掉的情況。

例如下圖:

5, 2, -1

3, 3, 0

6, 1, -1

3, 1, 0

3, 2, 3

掛到第4個時會有繩子斷掉,所以輸出3。

input

第1行:1個數n,表示繩子的數量(1 <= n <= 50000)。

第2 - n + 1行:每行3個數,ci, wi, pi,ci表示最大負重,wi表示重物的重量,pi表示掛在哪個繩子上,如果直接掛在鉤子上則pi = -1(1 <= ci <= 10^9,1 <= wi <= 10^9,-1 <= pi <= n - 2)。

output

輸出1個數,最多掛到第幾個繩子,不會出現繩子斷掉的情況。

這道題就是二分掛到幾個繩子,只有利用繩子來建立乙個樹,之後dfs計算每個節點的總重量。之後讓每個節點的總重量和能承受的重力做對比即可。

#include

#include

#include

using namespace std;

struct node

e[500006];

long long c[51000];

long long w[51000];

long long p[50006];

long long sum[510000];

long long head[50006];

long long cnt;

long long n;

void add(long long from,long long to)

long long  dfs(long long u)

return sum[u];

}long long slove(long long mid)

dfs(0);

for(long long i=1;i<=mid;i++)

return 1;

}int main()

long long l=1;

long long r=n;

long long ans=0;

while(r>=l)

else r=mid-1;

}cout<

51nod 1307 繩子與重物

1307 繩子與重物 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n條繩子編號 0 至 n 1,每條繩子後面栓了乙個重物重量為wi,繩子的最大負重為ci。每條繩子或掛在別的繩子下或直接掛在鉤子上 編號 1 如果繩子下所有重物的重量大於繩子的...

51nod 1307 繩子與重物

51nod 1307 繩子與重物 題目大意 給定 n 條繩子,每條繩子有最大承重 c i 總量 w i 和掛點 p i 問按順序掛最多掛幾條繩子.並查集考慮逆序掛繩子,若當前繩子最大承重小於實際承重,則將後面的繩子刪去.複雜度 o n 如下 1 include 2 include 3 using n...

51nod 1307繩子和重物

1307 繩子與重物 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 收藏關注有n條繩子編號 0 至 n 1,每條繩子後面栓了乙個重物重量為wi,繩子的最大負重為ci。每條繩子或掛在別的繩子下或直接掛在鉤子上 編號 1 如果繩子下所有重物的重量大於繩子的最大負重就...