poj2376(贪心+快排)

题意:有n头牛,每头牛都有一段工作时间,问工作t小时最少需要几头牛。即求出最少的区间数覆盖[1,t];

题目链接:http://poj.org/problem?id=2376

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct node
{
    int x;
    int y;
}s[30000];
int cmp(const void*a, const void*b)
{
    if((*(struct node*)a).x!=(*(struct node*)b).x)
  return (*(struct node*)a).x - (*(struct node*)b).x;
  else
    return (*(struct node*)b).y - (*(struct node*)a).y;
}
int main()
{
    int n;
    int t;
    int ans,End,time;
    while(scanf("%d %d", &n, &t) != -1)
    {
        for(int i = 0; i < n; i++)
            scanf("%d %d", &s[i].x, &s[i].y);
        qsort(s,n,sizeof(s[0]),cmp);
        if(s[0].x!=1)ans=-1;
        else
        ans = 1;
        time = s[0].y;
        if(time<t&&ans==1)
        for(int i = 1; i < n; i++)
        {
           if(s[i].x==s[i-1].x)continue;
           if(s[i].x > time+1 || time >= t)break;
           if(s[i].y > time)
           {
               End = s[i].y;
               for(int j = i+1; j < n; j++)
               {
                   if(s[j].x==s[j-1].x)continue;
                   if(s[j].x<=time+1&&s[j].y>=End)
                   {
                       End = s[j].y;
                       i=j;
                   }
               }
               time = End;
               ans++;
           }
        }
        if(time<t)ans=-1;
        printf("%d\n", ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值