您的位置:首页 > 其它

toj3479 Selfish Grazing

2013-09-24 23:14 260 查看
题目链接:http://acm.tju.edu.cn/toj/showp3479.html

题目大意:给定一系列牛放养的区间,同时放养的牛不能重合,问同时能放养的牛的数目;

思路:在刚刚写完上一篇解题报告之后,我直接把它的代码贴过来,改了下输入和数组大小,AC了,因为,它们是一模一样的区间调度的最大区间数问题。至于之前那种方法,这里也贴下,主要是他让我熟悉了qsort函数 和其cmp的写法,在做题时候,还是建议用第一种方法:即按结束时间排序,在根据后者的开始时间大于前者的结束时间(前者结束时间注意更新)得出最大区间数。这种方法简单。

代码:

代码一:(同上一题)

 

//   本题属于最大区间调度问题,即数轴上有n个区间,选出最多的区间,使这些区间互相不重叠。

//    算法:按右端点坐标排序,然后依次按后者的开始时间是否大于前者的结束时间(注意更新前者的下标)选择所有能选的区间。

#include<iostream>

#include<algorithm>

using namespace std;

struct node{

int s,e;

}activity[50005];

bool cmp(node a,node b)

{

 return a.e<b.e;  //按结束时间排序

}

int main()

{

  int n,d,st,i,ct,m;

  while(cin>>n&&n)

  {

    ct = 1;          //最多能参加的活动数  初始化为1!!

 for(i=0;i<n;i++)

 {

  cin>>st>>d;

  activity[i].s = st;

  activity[i].e = d;

 }

 sort(activity,activity+n,cmp);

 m=0;           

 for(i=1;i<n;i++)

 {

  if(activity[i].s>=activity[m].e)

  {

    ct++;   //如果后者的开始时间大于前者的结束时间,表明没有重合,能参加的活动数目加1

    m=i;    //后者和前者比,记着更新

  }

 }

 cout<< ct<<endl;

  }

  return 0;

}

代码二:

#include <iostream>

#include <cstdio>

#include <cstdlib>

using namespace std;

typedef struct cow

{

  int s,e;

}COW;

COW cow[50005];

int cmp(const void *a, const void *b)

{

    if((*(COW *)a).s==(*(COW *)b).s)

    return (*(COW *)a).e-(*(COW *)b).e;

    return (*(COW *)a).s-(*(COW *)b).s;

}

int main()

{

    int n,i;

    int max,end;

    cin>>n;

    for(i=0;i<n;i++)

    cin>>cow[i].s>>cow[i].e;
    qsort(cow,n,sizeof(cow[0]),cmp);//开始时间相同,按结束时间排序,否则按开始时间排序 与toj2894 Meetings是有区别的

    max = 1;

    end = cow[0].e;

    for(i=1;i<n;i++)

    {

      if(cow[i].s>=end)

      {

        max++;

        end = cow[i].e;

      }

      else if(cow[i].e<end)  //这是与上一种排序方法不同带来的唯一结果,所以说这样做反而麻烦了,建议用第一种方法。

      end = cow[i].e;

    }

    cout<<max<<endl;

    return 0;

}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 区间调度