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函数外的原因了。