1307 繩子與重物
基準時間限制:1 秒 空間限制:131072 kb 分值: 40 難度:4級演算法題
收藏關注有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)。output第2 - n + 1行:每行3個數,ci, wi, pi,ci表示最大負重,wi表示重物的重量,pi表示掛在哪個繩子上,如果直接掛在鉤子上則pi = -1(1 <= ci <= 10^9,1 <= wi <= 10^9,-1 <= pi <= n - 2)。
輸出1個數,最多掛到第幾個繩子,不會出現繩子斷掉的情況。input示例
5output示例5 2 -1
3 3 0
6 1 -1
3 1 0
3 2 3
3思路:1.二分,二分列舉最多能掛到第k個繩子,從第k個往第乙個推,若發現當前可以繩子可以承載下所有重物則將k增大,否則將k減小。
2.並查集,並查集自底向上維護每乙個繩子,若當前繩子掛的負重大於承重則從最後乙個重物開始往前刪,直到負重小於承重,這樣下去等掛到根節點的時候所有的重物都已經掛完了,剩下沒有刪掉的個數即為最多的個數
二分:
1 #include2 #include3 #include4並查集:5using
namespace
std;
6 typedef long
long
ll;7
const
int maxn = 50005;8
struct
node e[maxn];
11ll n;
12void
reset()
1317
intmain()
1825
int l = 1, r = n; bool
flag;
26while (l <=r)
35 e[e[i].pre].cost +=e[i].cost;36}
37if (flag) l = mid + 1;38
else r = mid - 1;39
}40 cout << r <
42return0;
43 }
1 #include2 #include3 #include45using
namespace
std;
6const
int maxn = 50005
;7 typedef long
long
ll;8
struct
task e[maxn];
11int
n, f[maxn];
12int find(int
x)13
18int
main()
1927
int ans =n;
28for (int i = n; i >= 1; i--)
34 e[e[i].pre].cost +=e[i].cost;
35 f[i] =e[i].pre;
36}
37 cout << ans <
39return0;
40 }
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 繩子與重物 二分 dfs
1307 繩子與重物 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n條繩子編號 0 至 n 1,每條繩子後面栓了乙個重物重量為wi,繩子的最大負重為ci。每條繩子或掛在別的繩子下或直接掛在鉤子上 編號 1 如果繩子下所有重物的重量大於繩子的...