计蒜客 - 法师康的工人

时间限制1000ms空间限制 65536K

题目描述

三个法师康的工人每天早上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

 

【思路】

一开始就想到按开始时间升序排序,但这是一道坑点比较多的题,初始化和变量的更新所有的细节都要做好才行,我的思路就是先结构体排序,然后用t1来记录当前能构成连续的最早开始时间,t2来记录当前已经能覆盖到的最晚时间,然后通过循环不断更新这两个值,每次循环都更新最大连续时间,当有断层出现时更新最大空闲时间。

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int n;
struct node {
	int le, ri;
}a[5050];

bool cmp(node x, node y) {
	if (x.le == y.le) return x.ri < y.ri;
	else return x.le < y.le;
}

int main() {
	while (scanf("%d", &n) == 1) {
		for (int i = 0; i < n; i++) {
			scanf("%d%d", &a[i].le, &a[i].ri);
			if (a[i].le > a[i].ri) swap(a[i].le, a[i].ri);
		}
		sort(a, a + n, cmp);

		int suc = a[0].ri - a[0].le, gap = 0, t1 = a[0].le, t2 = a[0].ri;//这里的初始化很重要
		//t1是当前保持连续的最早时间,t2是当前覆盖到的最晚结束时间

		for (int i = 1; i < n; i++) {
			if (a[i].le > t2) {//有间断时更新t1
				gap = max(gap, a[i].le - t2);
				t1 = a[i].le;
			}
			t2 = max(t2, a[i].ri);//每次都更新t2
			suc = max(suc, t2 - t1);
		}

		printf("%d %d\n", suc, gap);
	}
	return 0;
}

这里给出2个测试数据,我一开始就是因为细节问题WA在这上面了

sample input

1

100 200

sample output

100 0

(初始化处理不好这么一个简单数据都会WA)


sample input

10

2 3

4 5

6 7

8 9

10 11

12 13

14 15

16 17

18 19

1 20

sample output

19 0

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值