贪心算法之线段重合问题

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;
 }
}
发布了69 篇原创文章 · 获赞 50 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq873044564/article/details/88749356