题意: 有若干个人的请求,有无数台机器,每个机器隔K秒就会自锁。询问如何安排才可以让这些人使用机器时,需要解锁的次数最少。
输出节省的时间!!!
思路:
对于每个人的请求找到当前set里面最小的时间+k,如果可以则更改,若当前的时间比最小的时间+k都大,那么这个机器必定会锁上,set弹出。
set里存放的是当前工作的人离开的时间
#include <iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 300005;
struct node
{
int st, ed;
bool friend operator < (node a, node b)
{
return a.st < b.st;
}
} nod[maxn];
int main()
{
ios::sync_with_stdio(false);
int n, m;
cin>>n>>m;
for(int i=1; i<=n; ++i)
cin>>nod[i].st>>nod[i].ed;
sort(nod+1, nod+1+n);
multiset<int> st;
multiset<int>::iterator it;
int ans = 0;
for(int i=1; i<=n; ++i)
{
int stat = nod[i].st - m;
while(st.size() && *st.begin() < stat)
st.erase(st.begin());
if(st.size() && *st.begin() <= nod[i].st)
st.erase(st.begin());
else
ans ++;
st.insert(nod[i].st+nod[i].ed);
}
cout<<n-ans<<endl;
return 0;
}