不重叠的线段

X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。

例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠。

思路:贪心,就是以前的安排节目的题目,在这里将线段末端点按照从小到大排序,就跟哪个活动结束早哪个先安排

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>

using namespace std;

int const maxn = 10000;
int s[maxn],t[maxn];

pair<int,int> line[maxn];

int solve(int n){
    int ans = 0;

    for(int i = 0; i < n; i++){
        line[i].first = t[i];
        line[i].second = s[i];
    }

    sort(line,line+n);

    int t = -1e9;//线段末端位置

    for(int i = 0; i < n; i++){
        if(t <=  line[i].second){
            ans++;
            t = line[i].first;
        }

    }

    return ans;
}

int main(){
    int n;
    while(scanf("%d",&n) != EOF){
    for(int i = 0; i < n; i++) scanf("%d%d",&s[i],&t[i]);
    printf("%d\n",solve(n));

    }
      return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 09:27:54

不重叠的线段的相关文章

51NOD 1133 不重叠的线段

1133 不重叠的线段 X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的线段.(注:起点或终点重叠,不算重叠). 例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠. Input 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) Output 输出最多可以选择的线段数量. #include <bits/s

51nod 1133 不重叠的线段 (贪心,序列上的区间问题)

题意: 最多能选几条不重叠的线段 思路: 按R从小到大排序,维护一个最大的右端点 右端点最小的那个线段是必选的,可以贪心地证明 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<stack> #include<queue> #include<deque>

1133 不重叠的线段 (贪心算法,最大区间不重合问题)

X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的线段.(注:起点或终点重叠,不算重叠). 例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠. Input 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) Output 输出最多可以选择的线段数量. Input示例 3 1 5 2 3 3 6 Output示例

矩阵重叠面积计算 线段树hdu1542

Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14378    Accepted Submission(s): 5931 Problem Description There are several ancient Greek texts that contain descriptions of the fabled i

【贪心】1214 线段覆盖

http://codevs.cn/problem/1214/ 我去这个题...wa的我都没脾气了... 我写while(~scanf(“%d”, &n))竟然是不对的... 这个程序你妹多次输入是不能结束的????!!!!!! 改成scanf输入一次竟然就对了....整个人都不好了.... 就是一个贪心,做法和<今年暑假不AC>是一样的 按照结束时间(线段末尾排序),依次添加不重叠的线段即可 因为已经先按照结束时间排序,结束时间相同的按照开始时间排序,这样选择最早结束的一定不会使结果更

选择Nvidia显卡还是ATI显卡

粗略来讲: Nvidia的Geforce系列面向游戏,注重速度,而在纹理细节(如抗锯齿)方面欠佳: Nvidia的Quadro系列显卡面向设计,对三维建模软件比如solid3d, autocad等进行了软硬件优化: Nvidia的Tesla系列显卡面向CUDA并行计算,堆砌巨量显示核心,但不输出图像: ATI显卡主打的是显示效果,同等价位下比Geforce的显示核心要多,渲染效果要更加艳丽,纹理细节保持的更好,更好的抗锯齿能力,但游戏速度方面当然就要次一点. 对于我来说, 非常注重抗锯齿,最无法

CF527D

题面 这题还挺水的,把那个式子稍微变形一下就可以的到xi-wi>=xj+wj,易知:若把每个点看做一条线段,左端点是xi-wi,右端点是xi+wi,就只要求最多的不重叠的线段数就可以了,然后就是乱搞了 #include <cstdio> #include <algorithm> using namespace std; const int N=200005; int n; struct point{int x,w;}a[N]; inline bool cmp(point a,

线段的重叠(贪心)

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 先按线段起点升序排序,此时有两大种情况: 第一种是第二根线段的左边在第一根线段右边的右边, 即两根线段不相交,此时要将终点更新,因为是按起点升序排序,如果第二根的就不相交那之后的线段都不相交: 第二种大情况是相交,其第一种小情况是包含,此时要将重叠长度与最大重叠比较,但不需要更新终点, 第二种小情况是相交但不包含,此时不仅要比较最大重叠长度,还需要更新终点.

(算法)最长重叠线段或区间

题目: X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的.输出这个最长的距离.如果没有重叠,输出0. 思路: 1.暴力计算 依次计算两两线段之间的重叠长度,但复杂度太高 2.动态规划 假设S[n]表示n条线段中最长重叠距离,最长重叠距离只与两条线段有关,那么考虑两种情况: 1. 最长重叠距离与第n条线段无关,则最长重叠距离存在于前n-1条线段中