ACM暑期培训第一次积分赛F画线条

F 画线条(简单题)
时间限制内存限制出题人
1 Second 512 Mb 赵向阳
题目描述
zxy无聊的在纸上划着线条,队友不能容忍,于是借机给他出了一个简单的问题,让他把自己画
的n线条选择一部分摆到数轴上,且两两没有重合,然后问他最大的摆放数量k
输入
第一行为一个正整数n;
在接下来的n 行中,每行有2个数ai,bi描述每条线段。
n; ai; bi(0 < n; ai; bi 106)
输出
输出一个整数,为k的最大值。
输入样例
3
0 2
2 4
1 3
输出样例
2

简要思想:sort结构体排序,基础经典贪心选择思想

代码:

#include <stdio.h>
#include <algorithm>
using namespace std;
struct stu//定义结构体,l代表线段左坐标,r代表线段右坐标 
{
    int l,r;	
}p[1000001];
int cmp(stu x,stu y)//按右坐标的大小排序,如果右坐标相等,按左坐标排序 
{
	if(x.r<y.r)//记住,是按从小到大排序的意思 
	return 1;
    if(x.r==y.r)
    return x.l<y.l;//记住,是按从小到大排序的意思 
    return 0;
}
int main()
{
	int n,i,k=1,z;//k起始值为1 
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d%d",&p[i].l,&p[i].r);
	sort(p,p+n,cmp);
	z=p[0].r;//一开始z在第一条线段的右坐标位置 
	for(i=1;i<n;i++)
	{
		if(p[i].l>=z)//表示如果第二条线段的左大于第一条的右 
		{
			k++;
			z=p[i].r;//z就变成指向第二条的右,然后循环重复上述过程 
		}
	}
	printf("%d",k);
	return 0;
}

补充:数组如果定义在main函数里面,大小非常有限制(好像只有5个0),所以这就是为什么通常把数组定义在main函数外的原因了。

猜你喜欢

转载自blog.csdn.net/nanfengzhiwoxin/article/details/81170069