F、法师康的工人

题目描述

三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机。第一个工人在200时刻开始(从6点开始计时,以秒作为单位)在生产线上开始生产,一直到1000时刻。第二个工人,在700时刻开始,在1100时刻结束。第三个工人从1500时刻工作到2100时刻。期间最长至少有一个工人在生产线上工作的连续时间为900秒(从200时刻到1100时刻),而最长的无人生产的连续时间(从生产开始到生产结束)为400时刻(1100时刻到1500时刻)。
你的任务是用一个程序衡量N个工人在N条产品线上的工作时间列表(1≤N≤5000,以秒为单位)。
·最长的至少有一个工人在工作的时间段
·最长的无人工作的时间段(从有人工作开始计)

输入

输入第1行为一个整数N,第2-N+1行每行包括两个均小于1000000的非负整数数据,表示其中一个工人的生产开始时间与结束时间。

输出

输出为一行,用空格分隔开两个我们所求的数。

样例输入

3
200 1000
700 1100
1500 2100

样例输出

900 400

题解(写的有点繁琐^ v ^)

#include<bits/stdc++.h>
using namespace std;
int N; //N个工人
int x = 0; // 至少有一个工人在工作的最长时间段x
int y = 0; // 无人工作的最长时间段y(从有人工作开始计)
//vector<vector<int> >p(5001,vector<int>(2));//用vector定义二维数组p[][],5001行 2列
int(*p)[2] = new int [5001][2];//正常定义二维数组p[][],5001行 2列
int *c = new int[5001]; // 标记作用
int *d = new int[5001]; // 标记作用
void  Sort(){for(int i=0;i<N;i++) {for (int j = N-1; j >0; j--) {if(p[j][0]<p[j-1][0]) {int temp1=p[j][0];int temp2=p[j][1];p[j][0]=p[j-1][0];p[j][1]=p[j-1][1];p[j-1][0]=temp1;p[j-1][1]=temp2;}}}
}
void Seek(){// 寻找 最长的至少有一个工人在工作的时间段 x for(int j = 0;j<N;j++){// 标记为 1 的表明在前面已经走过 if(c[j] == 1) continue;c[0] = 1; int a = p[j][0]; // 最长时间段的起始时间 int b = p[j][1]; // 最长时间段的结束时间 int x1 = b - a; //最长时间段 for(int i=1;i<N;i++){// 如果两个时间段交叉相接,更新数据 if(p[i][0] < b && p[i][1] > b){x1 = x1 + p[i][1] - b;b = p[i][1];// 如果这个时间段和前面连接过,就标记为 1 c[i] = 1;}}if(x < x1) x = x1;       }// 寻找 最长的无人工作的时间段 y(从有人工作开始计)int tmp = p[0][1]; // 前面的最后时间节点 for(int i = 1;i< N;i++){if(d[i] == 1) continue;// 这个时间段与前面的最后时间节点之间有无人工作的时间 if(p[i][0] > tmp){if(y < p[i][0] - tmp) y = p[i][0] - tmp;tmp = p[i][1];}else if(p[i][1] <= tmp){//这个时间段最后时间节点小于前面的最后时间节点  ,就忽略它 d[i] =1;}else {// 如果交叉,就更新数据 tmp = p[i][1];}}
}
int main(){// 初始化 cin>>N;for(int i=0;i<N;i++){cin>>p[i][0]>>p[i][1];}memset(c, 0, sizeof(c));memset(d, 0, sizeof(d));//按照开始时间从小到大排序 Sort();//寻找最长时间段 Seek();cout<<x<<" "<<y;return 0;
}

中国矿业大学算法概论作业二 F、法师康的工人相关推荐

  1. 中国矿业大学算法概论作业二 D、汽车费用

    D.汽车费用 题目描述 一个特别的单行街道在每公里处有一个汽车站.顾客根据他们乘坐汽车的公里使来付费.例如下表就是一个费用的单子.没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n& ...

  2. 中国矿业大学算法概论作业一A、锯木棒

    A.algorithm-锯木棒 题目描述 xiaok大佬最近再雇佣工人给他掰木棒.把一根长为L的木棒锯成两段,他需要支付给工人L元钱.xiaok大佬一开始只有长为L的一根木棒,他想把它锯成n段,每段长 ...

  3. 中国矿业大学-算法概论-作业1

    问题 A: algorithm-锯木棒 题目描述 xiaok大佬最近再雇佣工人给他掰木棒.把一根长为L的木棒锯成两段,他需要支付给工人L元钱.xiaok大佬一开始只有长为L的一根木棒,他想把它锯成n段 ...

  4. 中国矿业大学算法概论作业一 D、沙子的质量

    D.沙子的质量 题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将N堆沙子合并成为一堆,每次只能合并相邻的两堆,合 ...

  5. 中国矿业大学算法导论作业

    中国矿业大学算法导论作业 文章目录 中国矿业大学算法导论作业 作业一 A: algorithm-锯木棒 B: algorithm-最长公共子序列 C: algorithm-矩阵连乘 D: algori ...

  6. 贪心算法-法师康的工人

    时间限制1000ms空间限制 65536K 题目描述 三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机.第一个工人在200时刻开始(从6点开始计时,以秒作为单位)在生产线上开始生产 ...

  7. 法师康的工人(贪心)

    三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机.第一个工人在200时刻开始(从6点开始计时,以秒作为单位)在生产线上开始生产,一直到1000时刻.第二个工人,在700时刻开始,在 ...

  8. 计蒜客 - 法师康的工人

    时间限制1000ms空间限制 65536K 题目描述 三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机.第一个工人在200时刻开始(从6点开始计时,以秒作为单位)在生产线上开始生产 ...

  9. 菜鸟学算法——动态规划(二)

    概述 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法,它是应用数学中用于解决某类最优化问题的重要工具.20世纪 ...

最新文章

  1. 看着拆焊过程,很治愈
  2. RHEL在VM虚拟机下仅主机模式不能联网的解决方法
  3. 河北工业机器人夹爪生产厂家_电动夹爪会成为“标配”吗?
  4. rewrite 伪静态,地址重写
  5. 如何用行为树开发游戏AI以及任务系统?
  6. QML工作笔记-界面登录框设置(方便其他控件居中)
  7. chrome的timeline的问题?
  8. ACM题目————STL练习之众数问题
  9. Android安全-代码安全1-ProGuard混淆处理
  10. Redis 下载安装
  11. 【通信仿真】Aloha协议仿真含Matlab源码
  12. Python数据分析入门与实践-笔记
  13. 杨绛:她和谁都不争,和谁争都不屑
  14. 基于PaddleOCR的集装箱箱号检测识别
  15. python之pypinyin
  16. win7平台下QT软件的打包与发布(部署与安装)
  17. FRAM 铁电存储器
  18. CICS定义资源-01
  19. 新手建站教程:如何建一个网站?
  20. 时间超限怎么办:手把手教你打表法

热门文章

  1. Windows错误系统配置提权之计划任务提权 (三)
  2. Java8部分新特性介绍
  3. video(k_video)
  4. 微信安卓协议分析笔记(高清长图)
  5. 脑PET图像分析和疾病预测方案总结
  6. 如何理解“特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)”
  7. 能否用全息图来治疗近视
  8. 关于进制补码的八位取值范围为什么是-128~127和补码-128的求取
  9. 线程锁EnterCriticalSection和LeaveCriticalSection的用法
  10. 供应商评估时要考虑的 5 个关键因素