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

                                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
#define smax 500
using namespace std;
int n,tot,top1,top2;
struct edge{
int be,en;
bool operator <(const edge a)const
{
return 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 {
tot++;
staa1[++top1]=i;
}
else if(es[i].be>=es[staa2[top2]].en&&es[i].be {
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);
}

你可能感兴趣的:(noip,c++)