雕刻时光

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

贪心优化+poj2376

Posted on 2011-12-07 21:11  huhuuu  阅读(365)  评论(0编辑  收藏  举报

http://poj.org/problem?id=2376

题目:问有N头牛,每头牛的工作时间不同,要工作T小时,最少需要几头牛工作

思路:一开始以为排序就可以过了,TLE了两次,25000*25000不优化会超啊,

果断另开一个数组,把排序后最优的数据放进去再选择

1 4

1 9

2 7

其实优化下就剩下1 9

View Code
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

struct data
{
int ll,rr;
}s[25009],end[25009];

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

int main()
{
int n,t;
while(scanf("%d%d",&n,&t)!=EOF)
{
int i,j;
for(i=0;i<n;i++)
{
scanf("%d%d",&s[i].ll,&s[i].rr);
}

sort(&s[0],&s[n],cmp);

int ADD=0,tempmax=0;
for(i=0;i<n;i++)
{
if(tempmax>=s[i].rr) continue;

tempmax=s[i].rr;
if(s[i].ll!=s[i+1].ll)
{
end[ADD].ll=s[i].ll;
end[ADD].rr=s[i].rr;
ADD++;
}
}

int ok=1;
int add=1,ll=end[0].ll,rr=end[0].rr;


for(i=1;i<ADD;i++)
{
add++;
int rj;
int temprr=rr;
for(j=i;j<ADD;j++)
{
if(temprr+1<end[j].ll)
{
if(j==i)
ok=0;
break;
}
else
{
if(end[j].rr>rr)
{
rr=end[j].rr;
rj=j;
}
}
}
if(ok!=0)
{
rr=end[rj].rr;
i=rj;
}

if(ok==0)break;
}

if(ok==0||ll>1||rr<t)
{
printf("-1\n");
}
else
printf("%d\n",add);
}
}