noip模拟题(活动安排升级版——戏剧表演)

本文介绍了如何解决一个NOIP模拟题,该题目涉及在两个同时可用的大厅中安排话剧表演,根据开始和结束时间,确定最多能安排多少场话剧。文章提到了贪心算法的应用,以及在处理过程中遇到的问题和解决方案,最后给出了作者的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                noip模拟题(戏剧表演)

某歌剧院有两个大厅,可以同时安排两场话剧表演。现在正值毕业季,电影学院的很多学生都要表演话剧,并且已经提前确定了演出的开始时间和结束时间。现在该歌剧院面临一个难题,他们最多可以演出多少场话剧。
输入
第一行一个整数N(N<=150)
接下来N行,每行表示一个开始时间和一个结束时间,在区间[0,1000000000]之间。
输出
一个整数,表示最多可以演出的话剧数。
样例输入 Copy
6
0 3
6 7
3 10
1 5
2 8
1 9
样例输出 Copy
4

刚拿到这道题的时候,想起了以前做的一道活动安排,不难一下子想到了贪心,心里一下子窃喜,
但有一点不同的是,活动安排只有一个教室,而这道题有两个教室,我一下子就纳闷了,按照活动安排的思路做了一遍,发现仅仅这样好像得不了正解,最终按照错误的贪心只拿了40分。

正解:其实这道题也是按照结束的时间从小到大排序,用两个栈来装,看当前的表演是否能装进去,如果两个都可以装进去,则装进结束时间完的那个,保证后面的戏剧有更多的空间装,但这道题的栈最好不要用stl,因为当stack为空的时候进行比较判断要报错,所以用数组模拟更为安全。

下面附上鄙人的代码一份,各位大神有其他更好的方法,希望一起分享一下。

#include<bits/stdc++.h>
#define smax 500
using namespace std;
int n,tot,top1,top2;
struct edge{
int be,en;
bool operator <(const edge a)const
{
return en<a.en;
}
}es[smax];
int staa1[smax];
int staa2[smax];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&es[i].be,&es[i].en);
}
sort(es+1,es+1+n);
staa1[++top1]=1;tot++;
for(int i=2;i<=n;i++)
{
if(es[i].be>=es[staa1[top1]].en&&es[i].be<es[staa2[top2]].en)
{
tot++;
staa1[++top1]=i;
}
else if(es[i].be>=es[staa2[top2]].en&&es[i].be<es[staa1[top1]].en)
{
tot++;
staa2[++top2]=i;
}
else if(es[i].be>=es[staa1[top1]].en&&es[i].be>=es[staa2[top2]].en)
{
if(es[staa1[top1]].en>=es[staa2[top2]].en)
{
tot++;staa1[++top1]=i;
}
else{
tot++;staa2[++top2]=i;
}
}
}
printf("%d",tot);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值