51nod 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)。
第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个数,最多挂到第几个绳子,不会出现绳子断掉的情况。
Input示例
5
5 2 -1
3 3 0
6 1 -1
3 1 0
3 2 3
Output示例
3

思路:1.二分,二分枚举最多能挂到第k个绳子,从第k个往第一个推,若发现当前可以绳子可以承载下所有重物则将k增大,否则将k减小。
   2.并查集,并查集自底向上维护每一个绳子,若当前绳子挂的负重大于承重则从最后一个重物开始往前删,直到负重小于承重,这样下去等挂到根节点的时候所有的重物都已经挂完了,剩下没有删掉的个数即为最多的个数

二分:
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 typedef long long LL;
 7 const int maxn = 50005;
 8 struct node {
 9     LL w, c, pre, cost;
10 }e[maxn];
11 LL n;
12 void reset()
13 {
14     for (int i = 0; i <= n; i++)
15         e[i].cost = 0;
16 }
17 int main()
18 {
19     ios::sync_with_stdio(false);
20     while (cin >> n) {
21         for (int i = 1; i <= n; i++) {
22             cin >> e[i].c >> e[i].w >> e[i].pre;
23             e[i].pre++;
24         }
25         int l = 1, r = n; bool flag;
26         while (l <= r) {
27             int mid = (l + r) >> 1;
28             flag = true;
29             reset();
30             for (int i = mid; i >= 1; i--) {
31                 e[i].cost += e[i].w;
32                 if (e[i].cost > e[i].c) {
33                     flag = false; break;
34                 }
35                 e[e[i].pre].cost += e[i].cost;
36             }
37             if (flag) l = mid + 1;
38             else r = mid - 1;
39         }
40         cout << r << endl;
41     }
42     return 0;
43 }

并查集:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 const int maxn = 50005;
 7 typedef long long LL;
 8 struct Task {
 9     int w, c, pre, cost;
10 }e[maxn];
11 int n, f[maxn];
12 int Find(int x)
13 {
14     if (f[x] != x)
15         f[x] = Find(f[x]);
16     return f[x];
17 }
18 int main()
19 {
20     ios::sync_with_stdio(false);
21     while (cin >> n) {
22         for (int i = 1; i <= n; i++) {
23             cin >> e[i].c >> e[i].w >> e[i].pre;
24             e[i].cost += e[i].w; e[i].pre++;
25             f[i] = i;
26         }
27         int ans = n;
28         for (int i = n; i >= 1; i--) {
29             while (e[i].cost > e[i].c) {
30                 int tmp = Find(ans);
31                 e[tmp].cost -= e[ans].w;
32                 ans--;
33             }
34             e[e[i].pre].cost += e[i].cost;
35             f[i] = e[i].pre;
36         } 
37         cout << ans << endl;
38     }
39     return 0;
40 }

 

转载于:https://www.cnblogs.com/wangrunhu/p/9470676.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;二级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个二级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液里的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值