1307 繩子與重物
codility
基準時間限制: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思路:有三種思路,直接思維,二分,並查集
一,直接思維:
從第一條繩子遍歷,每次判斷掛到第 i 條繩子時是否會斷掉,判斷是否斷掉即,向上搜尋它的連線繩子,判斷所承載的重量是否大於它的最大承載即可。但當所有的繩子是連成一條直線時的最壞 時間複雜度是 o(n^2)
二, 二分:
可以對最多掛到的繩子數進行 二分查詢。 而判斷最多掛到第 k 條繩子時,可以從 第k條繩向前判斷即可。這樣的時間複雜度為 o(nlog(n))
三,並查集:
對於所有的繩子從最後一條開始計算,當計算到 第 k 條繩子的承載重量 s[k]>最大承載重量 a[k].max時,則依次將最後一條繩子去掉,直到 s[k]<=a[k].max為止,只要計算到第一條繩子時就可得到最多掛到第幾個繩子。
code 1:
//直接思維-最壞時間複雜度 o(n^2)
#includeusing namespace std;
const int max_n=50005;
struct nodea[max_n];
int n,ans;
int main()
d=a[i].pre; w=a[i].w;
while(d!=-1)
d=a[d].pre;
} if(k) break;
} if(!k) ans=n;
cout
// 二分 o(nlog(n))
#include#includeusing namespace std;
typedef long long ll;
struct node;
const int max_n=50005;
int n;
ll s[max_n]; //s[i]:第i條繩子下所有重物的重量
node a[max_n];
int main()
if(a[k].per!=-1) s[a[k].per]+=s[k];
} if(boo==true)else r=h-1;
} cout
//並查集 o(n)
#includeusing namespace std;
typedef long long ll;
struct node;
const int max_n=50005;
int n;
int id[max_n];
ll s[max_n];
node a[max_n];
int find(int k);
int main()
int ans=n-1;
for(int i=n-1;i>=0;--i)
s[a[i].per]+=s[i];
id[i]=a[i].per;
} cout<
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 如果繩子下所有重物的重量大於繩子的最大負重就...
51nod 1307 繩子與重物 二分 dfs
1307 繩子與重物 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n條繩子編號 0 至 n 1,每條繩子後面栓了乙個重物重量為wi,繩子的最大負重為ci。每條繩子或掛在別的繩子下或直接掛在鉤子上 編號 1 如果繩子下所有重物的重量大於繩子的...