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;
}
题目大意:给定一系列牛放养的区间,同时放养的牛不能重合,问同时能放养的牛的数目;
思路:在刚刚写完上一篇解题报告之后,我直接把它的代码贴过来,改了下输入和数组大小,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;
}
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- NWERC2010 NKOJ2178 Stock Prices
- 2011ACM福州网络预选赛B题 HDU4062 Abalone
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- ACM常用算法
- 2013 Multi-University Training Contest 1
- ACM/ICPC需要掌握的知识[转载]
- 北大—1006——Biorhythms
- Gridland (初试ACM)
- Digital Roots
- Word Reversal
- 新手UVa 10250 The Other Two Tree && 10050 Hartals