2882: 美食节之感恩父母

来源:互联网 发布:手机淘宝店铺怎么分享 编辑:程序博客网 时间:2024/04/29 04:42

描述

虽然美食节的食品又多又好吃,但是在大家心目中,最好吃的还是亲爱的爸爸妈妈煮的爱心饭菜,可能没有美食节种类那么多,但是与饭菜一起煮进去的还有父母浓浓的爱啊
我们acm队也是一个大家庭,xzc也会煮菜哦,请设想假如某天acm队的成员一起到crq (crq是我们集训队的家长哈)家里吃饭去,crq家有材料若干,xzc会做m种菜,但是每种菜所需的材料种类数量是不一样的,现在把crq家的材料都排成一排从0开始标记好,xzc做菜时就在这排标记好材料里面抽一段用来做菜,现在xzc要好好表现了,请你求xzc总共能做多少种菜?

输入

输入数据有多组,每组数据第一行有一个数m, m代表xzc会做m种菜;
接下来有m行,每行两个正整数a,b,代表这种菜所需的材料是截取标记好的crq家的材料中从a至b的材料;当m等于0的时候结束循环

输出

每组数据输出一个max,max代表xzc在这次acm聚餐时能做出来的菜最多有多少种。

样例输入

样例输出





思路就是同一段的食材是不可以重复使用的。所以我们要尽量的让同样多的食材做出更多的菜。

所以我们就想到用贪心来做。先以结束的食材编号为主要的依据进行升序排序,当结束食材的变号相同是以开始的食材的编号为依据进行升序排序。

然后要尽可能多的选择出来食材去做菜。

代码如下:

#include<stdio.h>
#include<algorithm>
using namespace std;
struct A
{
int a,b;
}zi[1000];
bool cmp(A x,A y)
{
if(x.b==y.b)return x.a<y.a;
else return x.b<y.b;
}
int main()
{
int m,a,b,i,j;
while(scanf("%d",&m),m)
{
int c=0;
for(i=0;i<m;i++)
scanf("%d%d",&zi[i].a,&zi[i].b);
sort(zi,zi+m,cmp);
for(i=1,j=0,c=1;i<m;i++)
{
if(zi[i].a>=zi[j].b)
{
c++;
j=i;
}
}
printf("%d\n",c);
}
}


0 0
原创粉丝点击