Description
数轴上有 n 条线段,选取其中 k 条线段使得这 k 条线段两两没有重合部分,问 k 最大为多少。
Input
多组测试数据,每组测试数据的输入格式描述如下:
第一行为一个正整数 n,n≤10^6;
在接下来的 n 行中,每行有 2 个数 ai, bi ,描述每条线段,0≤ai <bi ≤10^6 。
Output
每组测试数据的输出占一行,每行输出一个整数,为 k 的最大值。
Sample Input
3
0 2
2 4
1 3
Sample Output
2
其实这个题和我上一篇写得那个活动安排是一个思路:活动安排问题,无非就是数据量大了许多,开一个比较大的数组就行,但是我今天发现了一个很奇葩的事情,我的c++代码过不了,说我超时,但是我只是把输入改成C语言的输入,就很意外就ac了,就很过分地让我看了一个多小时到底是哪里不对,看来C语言确实比c++快一些,尤其是对于数据量很大的题来说,有时候语言也是影响运行时间的一个因素.
有图有真相(真的是换了一种输入方式就过了):
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAX_ACTIVITY_NUM 1000001
typedef struct activity{
int start_time;
int end_time;
}Activity,acti[MAX_ACTIVITY_NUM];
int cmp(activity a,activity b){
return a.end_time<b.end_time;
}
int Compare(acti activity,int n){
int num = 1;
int j=1;
for(int i=2;i<=n;i++){
if(activity[i].start_time>=activity[j].end_time){
j=i;
num++;
}
}
return num;
}
int main(){
int n;
acti act;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
scanf("%d%d",&act[i].start_time,&act[i].end_time);
}
sort(act+1,act+n+1,cmp);
int num=Compare(act,n);
cout<<num<<endl;
}
}