题意:
有n头牛,每头牛挤奶的时间段是不同的,现在问在不同的时间段中最少用多少机器才能满足。
思路:
首先这是贪心类型1的题:被称为 staying ahead,即保持领先,意义为如果我们运用某个策略,在算法的每一步中都使某个条件保持领先,那么最后可以利用这个领先条件来证明最优解。
这里用两个策略:
- 按照开始时间进行排序,这样可以遍历每一种情况
- 按照每次结束的时间最早的寻找满足无交叉的时间段。
若时间无交叉则可以用一样的机器,若时间有交叉需要添加机器。 用record记录第c头牛用第几台机器。
注意:
第一策略需要排序很简单,但是第二种需要注意使用方法。
#include<iostream>
#include<queue>
using namespace std;
class Node
{
public:
int x,y;
friend operator<(Node a,Node b)
{
return a.x > b.x; //top指向的是队首
}
};
int main()
{
Node temp;
temp.x = 3;
temp.y = 2;
priority_queue<Node>Q;
Q.push(temp);
temp.x = 2;
temp.y = 2;
Q.push(temp);
while(!Q.empty()){
cout<<Q.top().x<<" "<<Q.top().y<<endl;
Q.pop();
}
return 0;
}
源码:
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
class Node
{
public:
int x,y;
int c;
friend bool operator<(Node a,Node b)
{
return a.y > b.y;
}
}cow[50005];
int cmp(Node a,Node b)
{
return a.x < b.x;
}
int record[50005];
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i = 0;i < n; i++){
scanf("%d%d",&cow[i].x,&cow[i].y);
cow[i].c = i;
}
sort(cow,cow+n,cmp);
priority_queue<Node>Q;
Q.push(cow[0]);
int ans = 0;
record[cow[0].c] = ++ans;
for(int i = 1;i < n; i++){
Node temp = Q.top();
if(temp.y < cow[i].x){
record[cow[i].c] = record[temp.c];
Q.pop();
Q.push(cow[i]);
}
else {
record[cow[i].c] = ++ans;
Q.push(cow[i]);
}
}
cout<<ans<<endl;
for(int i = 0;i < n; i++){
cout<<record[i]<<endl;
}
return 0;
}