USACO silver 18 JAN T1

9 篇文章 0 订阅

题目链接

http://www.usaco.org/index.phppage=viewproblem2&cpid=786

思路

先按照开始时间从小到大排序,把总覆盖时间求出来
在用第二个for循环把最小单独覆盖的求出来

#include<bits/stdc++.h>
//#define long long int
using namespace std;
const int N = 1e5+5;
struct node{
	int l,r;
}line[N];
int n;
bool cmp(node a, node b){
	if (a.l != b.l) return a.l < b.l;
	return a.r < b.r;
}
int main(){
	freopen ("lifeguards.in","r",stdin);
	freopen ("lifeguards.out","w",stdout);
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> line[i].l >> line[i].r;
	}
	sort(line+1,line+1+n,cmp);
	int last = line[1].l, ans = 0;
	for (int i = 1; i <= n; i++){
		//这个for求出总覆盖时间 
		if (line[i].r > last){
			if (last > line[i].l){
				ans += line[i].r-last;
				last = line[i].r;
			}else{
				ans += line[i].r-line[i].l;
				last = line[i].r;
			}
		}
	}
	last = line[1].l;
	line[n+1].l = line[n].r;			//设定边界 
	int m;
	for (int i = 1; i <= n; i++){
		//找出自己一个人工作时间最小的人 
		if (line[i].r < last){
			m = 0;
		}else{
			int p = max(0,min(line[i].r,line[i+1].l) - max(line[i].l, last));
			last = max(last, line[i].r);
			m = min(m,p);
		}
		
	}
	cout << ans-m;
}

反思

碰到这类问题画图来想会比较清楚

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值