题目来源: 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.并查集,并查集自底向上维护每一个绳子,若当前绳子挂的负重大于承重则从最后一个重物开始往前删,直到负重小于承重,这样下去等挂到根节点的时候所有的重物都已经挂完了,剩下没有删掉的个数即为最多的个数 二分:
 #include<iostream>
#include<algorithm>
#include<cstring> using namespace std;
typedef long long LL;
const int maxn = ;
struct node {
LL w, c, pre, cost;
}e[maxn];
LL n;
void reset()
{
for (int i = ; i <= n; i++)
e[i].cost = ;
}
int main()
{
ios::sync_with_stdio(false);
while (cin >> n) {
for (int i = ; i <= n; i++) {
cin >> e[i].c >> e[i].w >> e[i].pre;
e[i].pre++;
}
int l = , r = n; bool flag;
while (l <= r) {
int mid = (l + r) >> ;
flag = true;
reset();
for (int i = mid; i >= ; i--) {
e[i].cost += e[i].w;
if (e[i].cost > e[i].c) {
flag = false; break;
}
e[e[i].pre].cost += e[i].cost;
}
if (flag) l = mid + ;
else r = mid - ;
}
cout << r << endl;
}
return ;
}

并查集:

 #include<iostream>
#include<algorithm>
#include<cstring> using namespace std;
const int maxn = ;
typedef long long LL;
struct Task {
int w, c, pre, cost;
}e[maxn];
int n, f[maxn];
int Find(int x)
{
if (f[x] != x)
f[x] = Find(f[x]);
return f[x];
}
int main()
{
ios::sync_with_stdio(false);
while (cin >> n) {
for (int i = ; i <= n; i++) {
cin >> e[i].c >> e[i].w >> e[i].pre;
e[i].cost += e[i].w; e[i].pre++;
f[i] = i;
}
int ans = n;
for (int i = n; i >= ; i--) {
while (e[i].cost > e[i].c) {
int tmp = Find(ans);
e[tmp].cost -= e[ans].w;
ans--;
}
e[e[i].pre].cost += e[i].cost;
f[i] = e[i].pre;
}
cout << ans << endl;
}
return ;
}

51nod 1307绳子和重物的更多相关文章

  1. 51nod 1307 绳子与重物 (标记父节点更新即可)

    1307 绳子与重物 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N条绳子编号 0 至 N - 1,每条绳子后面栓了一个重物重量为Wi,绳子的最大负重为Ci. ...

  2. 51nod 1307 绳子与重物(并查集水了一发)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 思路: 可以直接二分答案,然后dfs. 因为标签是并查集, ...

  3. 1307 绳子与重物(DFS)

    1307 绳子与重物 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N条绳子编号 0 至 N - 1,每条绳子后面栓了一个重物重量 ...

  4. 51NOD 1639 绑鞋带 数学

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1639 假如一开始有一根绳子. 那么增加一根的时候,可以插在它的尾部,也可 ...

  5. 51nod 1243 排船的问题(二分)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 题意: 思路: 二分来做,每次贪心的把船安排到能安排的最左边即可. ...

  6. 51nod 1243 二分+贪心

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制: ...

  7. 51nod 1449 贪心

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1449 1449 砝码称重 题目来源: CodeForces 基准时间限制 ...

  8. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  9. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

随机推荐

  1. 【JZOJ4816】【NOIP2016提高A组五校联考4】label

    题目描述 输入 输出 样例输入 3 2 2 0 1 2 3 3 2 1 3 1 2 3 3 1 1 2 2 3 样例输出 4 2 12 数据范围 样例解释 解法 设f[i][j]为在第i个点填了j的合 ...

  2. 软件测试 → 第一章 基础-> 软件与软件危机

    一. 软件概念 1.软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合.2.程序是按事先设计的功能和性能要求执行的指令序列.3.数据是使程序能正常操纵信息的数据结构. ...

  3. Directx11教程41 纹理映射(11)

    原文:Directx11教程41 纹理映射(11)     1.第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8.     samplerDesc.Filter =  D3D11_FILT ...

  4. asp.net ajax客户端框架如何调用Web Service

    asp.net ajax客户端框架如何调用Web Service 1:Web Service类添加 [System.Web.Script.Services.ScriptService]特性2:需要异步 ...

  5. 小爬爬1:开篇&&简单介绍启动

    1.第一阶段的内容 2.学习的方法? 思考,总结,重复 3.长大了意味着什么?家庭的责任,真的很重 4.数据分析&&数据清洗 numpy&&pandas&&am ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第五章:渲染流水线 学习目标 了解几个用以表达真实场景的标志和2D图像 ...

  7. python 不定长参数**kwargs

  8. HZOJ 老司机的狂欢

    比较神仙的一道题. 第一问还比较简单一点: t是否可行是单调的,考虑二分. 考虑对于两个人i,j合法的条件,设x(i)<x(j),那么$x(i)+\frac {a(i)*t^2}{2} < ...

  9. javascript —— 禁止通过 Enter 键提交表单

    $('btn').on('keydown', function () { return false; })

  10. Oracle中组合索引的使用详解(转)

    在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引.在组合索引的使用方面,Oracle有以下特点: 1. 当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的w ...