poj2376(贪心+快排)

来源:互联网 发布:淘宝发空包怎么操作 编辑:程序博客网 时间:2024/05/16 13:47

题意:有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;}


0 0
原创粉丝点击