现在的位置: 首页 > 综合 > 正文

toj3479 Selfish Grazing

2014年07月12日 ⁄ 综合 ⁄ 共 1549字 ⁄ 字号 评论关闭

题目链接: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;
}
 

 

抱歉!评论已关闭.