雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

贪心(优先队列优化)——pku3190

Posted on 2011-07-27 15:43  huhuuu  阅读(301)  评论(0)    收藏  举报
比较好的贪心题
也学会了优先队列吧
思路:
现对开始时间升序排序(再一次领教到了排序降维的意义!!!
优先队列里放add(第几次stall),rr(结束时间)
在把第一个放到优先队列,第二个数与优先队列顶部进行比较
若第二个数结束时间>优先队列顶部结束时间,则更新该顶部时间
否则 第二个数加到该优先队列里
View Code
#include<iostream>
#include
<cstdio>
#include
<algorithm>
#include
<queue>
#include
<string.h>
using namespace std;

int re[50009];
struct da
{
int ll,rr;
int no;
}node[
50009];

struct data
{
friend
bool operator<(data a,data b)
{
return a.rr>b.rr;//内部按val从小到大
}
int rr;
int add;
};

bool cmp(da a,da b)
{
if(a.ll==b.ll)
return a.rr<b.rr;
else
return a.ll<b.ll;
}

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(re,
0,sizeof(re));
priority_queue
<data> qq;
int i;
for(i=0;i<n;i++)
{
scanf(
"%d%d",&node[i].ll,&node[i].rr);
node[i].no
=i;
}

sort(
&node[0],&node[n],cmp);
data fi;
fi.rr
=node[0].rr;
fi.add
=1;
re[node[
0].no]=1;
qq.push(fi);
int stall=1;

for(i=1;i<n;i++)
{
if(qq.top().rr<node[i].ll)
{
re[node[i].no]
=qq.top().add;

data se;
se.rr
=node[i].rr;
se.add
=qq.top().add;
qq.pop();
qq.push(se);
}
else
{
stall
++;
re[node[i].no]
=stall;
data se;
se.rr
=node[i].rr;
se.add
=stall;
qq.push(se);
}

}

printf(
"%d\n",stall);
for(i=0;i<n;i++)
{
printf(
"%d\n",re[i]);
}
}
return 0;
}