P1668 [USACO04DEC] Cleaning Shifts S 题解

原文

一天有 T ( 1 ≤ T ≤ 1 0 6 ) T(1≤T≤10^6 ) T(1T106)个时段。约翰正打算安排他的 N ( 1 ≤ N ≤ 2.5 × 1 0 4 ) N(1≤N≤2.5×10^4 ) N(1N2.5×104) 只奶牛来值班,打扫打扫牛棚卫生。每只奶牛都有自己的空闲时间段 [ S i , E i ] ( 1 ≤ S i ≤ E i ≤ T ) [S_i,E_i](1≤S_i ≤E_i ≤T) [Si,Ei](1SiEiT),只能把空闲的奶牛安排出来值班。而且,每个时间段必需有奶牛在值班。

那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的方案,就输出 − 1 -1 1

样例

输入
3 10
1 7
3 6
6 10
输出
2

思路

先讲 n n n 头牛的空闲时间按 s i s_i si 大小排序,然后对于每头牛查看前面是否有牛与其交接( n o d e [ i ] . a ≤ n o d e [ j ] . b + 1 node[i].a \leq node[j].b + 1 node[i].anode[j].b+1 a , b a,b a,b s , e s,e s,e ),如果有这修改当前所需时间,最后循环一遍找出最少所需时间即可。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,t;
struct cow{
	int a,b;
	friend bool operator <(cow c,cow d) {
		if(c.a == d.a) return c.b < d.b;
		return c.a < d.a;
	}
}node[25005]; 
int ans[25005],min_ans = 1e18;
signed main() {
	scanf("%lld %lld",&n,&t);
	for(int i = 1;i <= n;i++) {
		scanf("%lld %lld",&node[i].a,&node[i].b);
	}
	sort(node + 1,node + n + 1);
	for(int i = 1;i <= n;i++) {
		if(node[i].a != 1)ans[i] = pow(2,32);
		else ans[i] = 1;
		for(int j = i - 1;j >= 1;j--) {
			if(node[i].a <= node[j].b + 1) {//i号奶牛接班j号奶牛 
				ans[i] = min(ans[i],ans[j] + 1);
			}
		}
	}
	for(int i = 1;i <= n;i++) {
		if(node[i].b == t and ans[i] != pow(2,32)) {
			min_ans = min(ans[i],min_ans);
		}
	}
	if(min_ans == 1e18)printf("-1\n");
	else printf("%lld\n",min_ans);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值