您的位置:首页 > 其它

区间贪心·POJ--2376·Cleaning Shifts

2018-03-15 11:40 447 查看
题目大意:给定开始时间区间个数n, 时间区间上限T;
求解最少需要多少区间可以覆盖[1, T];
解题思路:
我们将区间按照左端点排序,从头开始枚举,做右端点最大值标记t,并更新每次所能找到的尽可能靠右的temp,当当前t不能满足下一个区间的左端点时,用temp更新t。最后只需要判断t是否大于等于T即可;
AC代码:#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;
#define maxn 1010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ms(x,y) memset(x,y,sizeof(x))
#define rep(i,n) for(int i=0;i<(n);i++)
#define repf(i,a,b) for(int i=(a);i<=(b);i++)
#define pii pair<int,int>
//#define mp make_pair
#define FI first
#define SE second
#define IT iterator
#define PB push_back
#define Times 10
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int ,int > P;

const double eps = 1e-10;
const double pi = acos(-1.0);
const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const ll INF = (ll)1e18+300;
const int maxd = 25000 + 5;

//struct node{
// int l, r;
// node(int ll = 0, int rr = 0):l(ll), r(rr) {}
//};
//node ac[maxd];

//bool cmp(node a, node b){
// if(a.l != b.l)
// return a.l < b.l;
// else return a.r > b.r;
//}

//int main(){
// int n, t;
// cin >> n >> t;
// for (int i = 0; i < n; i++) {
// cin >> ac[i].l >> ac[i].r;
// }
// sort(ac, ac + n, cmp);
// int ans = 1;
// int res = ac[0].r;
// if(ac[0].l != 1) {
// cout << "-1" << ednl;
// return 0;
// }
// int max_r = res;
// int flag = 1;
// int flag1 = 0;
// for (int i = 1; i < n; i ++) {
// if(ac[i].l > res) {
// falg1 = 1;
// if(res == ac[i - 1].r) {
// flag = 0 ;
// break;
// }
// else {
// res = ac[i - 1].r;
// ans ++;
// i --;
// }
// }
// else {
// max_r = max(max_r, ac[i].r);
// }
// }
// if(!flag) {
// cout << "-1" << endl;
// }
// else if(!flag1) {
// if(res >= t) {
// cout << "1" << endl;
// }
// else {
// if(max_r >= t) {
// cout << "2" << endl;
// }
// }
// }
// else if(max_r)cout << ans << endl;
//}
const int MAXN=26000;

struct node
{
int x,y;
}a[MAXN];
int n,T;

bool cmp(node a,node b)
4000
{return a.x<b.x;}

int main()
{
scanf("%d%d",&n,&T);
for (int i=1;i<=n;++i)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp);
a[n+1].x=inf;
int t=0,temp=0,ans=0;
bool f=0;
for (int i=1;i<=n;++i)
if (a[i].x<=t+1)
{
if (temp<a[i].y) temp=a[i].y,f=1;
if (a[i+1].x>t+1 && f)
t=temp,++ans,f=0;
}
if (t<T) printf("-1\n"); else printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: