Description
小J是一个大公司的保安队长
一天有T个时间段.小J正打算安排他的N个保安来值班,.
每个保安都有自己的空闲时间段[Si,Ei],只能把空闲的保安安排出来值班
于是这个保安就可以从第Si个时间段工作到第Ei个时间段
而且,每个时间段必需有保安在值班.
那么,最少需要动用多少保安参与值班呢?
如果没有办法安排出合理的方案,就输出-1.
Format
Input
第1行:N,T.
第2到N+1行:Si,Ei
1≤T≤10^6
(1≤N≤25000)
(1≤Si≤Ei≤T)
Output
最少安排的奶牛数
Samples
输入数据 1
3 10
1 7
3 6
6 10
Copy
输出数据 1
2
Copy
输入数据 2
3 10
1 3
5 7
8 10
Copy
输出数据 2
-1
Copy
样例说明
对于样例1来说
安排第一个保安,他可以从第1个时间段工作到第7个时间段
再安排第三个保安,他可以从第6个时间段工作到第10个时间段
对于是样例2来说
无论如何安排,第4个时间段是没有上班的,所以无解。
思路
这道题可以使用贪心算法:先按头排序,再对于每一个要用到的保安按尾最后的来寻找下一个保安。
代码见下:
#include<bits/stdc++.h>
using namespace std;
long long n,m,a,c[54],d[10000001],k,p,ss[500001][51],sd[10000001],ww,sw,t;
struct ll{
long long s,e;
}z[10000010];
bool cmp(ll a,ll b){
return a.s<b.s;
}
int main(){
//map<long long,ll> ;
map<long long,long long> b;
cin>>n>>p;
for(long long i=1;i<=n;i++){
cin>>z[i].s>>z[i].e;
// b[z[i].s]=i;
// b[z[i].e]=i;
}
sort(z+1,z+n+1,cmp);
long long mn1=0,i=1;
while(i<=n){
long long j=i,u=mn1;
while(z[i].s<=mn1+1&&i<=n){
u=max(u,z[i].e);
i++;
}
//cout<<i<<" "<<u<<" "<<mn1<<endl;
if(u<=mn1){
cout<<"-1";
return 0;
}
mn1=u;
t++;
if(mn1>=p) break;
}
if(mn1<p){
cout<<"-1";
return 0;
}
cout<<t;
return 0;
}