南阳理工 oj14 会场安排问题
2013-04-10 09:00
239 查看
会场安排问题
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入第一行是一个整型数m(m<100)表示共有m组测试数据。 每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。 随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)输出对于每一组输入,输出最多能够安排的活动数量。 每组的输出占一行样例输入
2 2 1 10 10 11 3 1 10 10 11 11 20
样例输出
1 2
提示注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始用map容器 耗时398
01.
#include<iostream>
02.
#include<cstring>
03.
#include<map>
04.
using
namespace
std;
05.
int
main()
06.
{
07.
//freopen("in.txt","r",stdin);
08.
map<
int
,
int
> mp;
09.
map<
int
,
int
>::iterator ite,f;
10.
int
n,m,beg,end,i,t;
11.
cin>>n;
12.
while
(n--)
13.
{
14.
mp.clear ();
15.
cin>>m;
16.
for
(i=0;i<m;i++)
17.
{
18.
cin>>beg>>end;
19.
ite=mp.find (end);
20.
if
(ite!=mp.end ())
21.
{
22.
if
((*ite).second <beg)
23.
{
24.
mp.erase (end);
25.
mp[end]=beg;
26.
}
27.
}
28.
else
mp[end]=beg;
29.
30.
}
31.
for
(ite=mp.begin (),t=1,f=ite++;ite!=mp.end ();ite++)
32.
{
33.
if
((*ite).second >(*f).first )
34.
{
35.
t++;f=ite;
36.
}
37.
}
38.
cout<<t<<endl;
39.
}
40.
return
0;
41.
}
用数组,不加优化标记 耗时228
01.
#include<iostream>
02.
#include<cstring>
03.
#include<algorithm>
04.
using
namespace
std;
05.
struct
st
06.
{
07.
int
x,y;
08.
}str[10005];
09.
10.
bool
cmp(st xi,st yi)
11.
{
12.
return
xi.y<yi.y;
13.
}
14.
int
main()
15.
{
16.
//freopen("in.txt","r",stdin);
17.
18.
int
n,m,beg,end,i,t,f,max;
19.
cin>>n;
20.
while
(n--)
21.
{
22.
23.
cin>>m;max=0;
24.
for
(i=0;i<m;i++)
25.
{
26.
cin>>beg>>end;
27.
str[i].x=beg;
28.
str[i].y=end;
29.
}
30.
31.
sort(str,str+m,cmp);
32.
for
(i=1,t=1,f=i-1;i<m;i++)
33.
{
34.
if
(str[i].x>str[f].y)
35.
{
36.
t++;f=i;
37.
}
38.
}
39.
cout<<t<<endl;
40.
41.
}
42.
return
0;
43.
}
极致优化后 耗时60
(借鉴代码)
01.
#include<stdio.h>
02.
#include<string.h>
03.
int
get_num(
int
a[],
int
min,
int
max);
04.
int
a[10001];
05.
int
main(
void
)
06.
{
07.
int
n, m, begin, end;
08.
int
i, min,max;
09.
scanf
(
"%d"
, &n);
10.
getchar
();
11.
while
(n--){
12.
scanf
(
"%d"
, &m);
13.
getchar
();
14.
memset
(a, 0,
sizeof
(a));
15.
max = 0;
16.
min = 100;
17.
while
(m--){
18.
scanf
(
"%d%d"
, &begin, &end);
19.
getchar
();
20.
//if(max == 0)
21.
// min = end;
22.
if
(min > end)
23.
min = end;
24.
if
(end > max)
25.
max = end;
26.
if
(a[end] == 0)
27.
a[end] = begin;
28.
else
{
29.
if
(begin > a[end])
30.
a[end] = begin;
31.
}
32.
}
33.
printf
(
"%d\n"
, get_num(a, min,max));
34.
}
35.
return
0;
36.
}
37.
int
get_num(
int
a[],
int
min,
int
max)
38.
{
39.
int
i, count, begin;
40.
for
(i = min,count = 0, begin = 0; i <= max; i++){
41.
if
(a[i] != 0){
42.
if
(a[i] > begin){
43.
begin = i;
44.
count++;
45.
}
46.
}
47.
}
48.
return
count;
49.
}
相关文章推荐
- 南阳理工OJ_题目14 会场安排问题
- C语言 南阳理工ACM 14 会场安排问题
- 【南阳OJ 14】 会场安排问题(贪心)
- 南阳理工14 -会场安排问题
- 会场安排问题(南阳oj14)(贪心-区间不重叠)
- [转]会场安排问题 南阳理工学院OJ 题目14
- 南阳理工14(会场安排问题)
- NYOJ 14 会场安排问题
- NYOJ14-会场安排问题
- nyoj14会场安排问题
- NYOJ 14 会场安排问题
- 会场安排问题 noj 14题
- nyoj 14 会场安排问题
- 会场安排问题 nyist -14
- NYOJ 14.(贪心) 会场安排问题
- nyoj 14 会场安排问题
- 【ACM】nyoj_14_会场安排问题_201308151955
- NYOJ 14 会场安排问题
- [置顶]ny-14-会场安排问题
- NYOJ 14 会场安排问题(贪心算法)