题目描述
数轴上有 nn 条线段,选取其中 kk 条线段使得这 kk 条线段两两没有重合部分,问 kk 最大为多少。
输入格式
第一行为一个正整数 nn;
在接下来的 nn 行中,每行有 22 个数 a_i, b_iai,bi,描述每条线段。
输出格式
输出一个整数,为 kk 的最大值。
样例
Inputcopy | Outputcopy |
---|---|
3 0 2 2 4 1 3 | 2 |
数据范围与提示
对于 20\%20% 的数据,n \leq 10n≤10;
对于 50\%50% 的数据,n \leq 10^3n≤103;
对于 70\%70% 的数据,n \leq 10^5n≤105;
对于 100\%100% 的数据,n \leq 10^6,n≤106, 0 \leq a_i \lt b_i \leq 10^60≤ai<bi≤106。
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int sum=0,n;
struct line
{
int start,end;
}k[1000000];
int cmp(line x,line y)
{
return x.end<y.end;
}
int main()
{
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
scanf("%d %d",&k[i].start,&k[i].end);
}
//按区间结束的先后顺序从小到大排序
sort(k,k+n,cmp);
int end=0;
for(i=0;i<n;i++)
{
if(k[i].start>=end)
{
sum++;
end=k[i].end;
}
}
printf("%d\n",sum);
return 0;
}
Complie error 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int sum=0,n;
struct move
{
int start,end;
}k[1000000];
int cmp(move x,move y)
{
return x.end<y.end;
}
int main()
{
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
scanf("%d %d",&k[i].start,&k[i].end);
}
//按区间结束的先后顺序从小到大排序
sort(k,k+n,cmp);
int end=0;
for(i=0;i<n;i++)
{
if(k[i].start>=end)
{
sum++;
end=k[i].end;
}
}
printf("%d\n",sum);
return 0;
}
这两段代码基本一样,只是结构体的名字不一样,为什么会这样,下面Complie error 的代码我在dev 里运行是OK的,我搜了结构体的命名有什么讲究,没看到相关的文章,有懂的大佬指点一下吗,费解