您的位置:首页 > 其它

poj2376 Cleaning Shifts(区间贪心)

2016-03-18 00:22 363 查看
题意:给你n组区间,和一个范围M,每个区间起点终点,你选择最少的区间,把整个范围M铺满。

贪心:对区间起点,终点排序后,选择下一个能选的所有区间里,终点最远的。

#include <fstream>
#include <iostream>
#include <string>
#include <cstring>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <ctime>
#include <assert.h>

#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define eps 1e-8
#define M_PI 3.141592653589793

typedef long long ll;
const ll mod=1000000007;
const int inf=0x7fffffff;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
using namespace std;
struct node
{
int x,y;
}a[25000+10];
bool cmp(node a,node b)
{
if(a.x==b.x) return a.y<b.y;
else return a.x<b.x;
}

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