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/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
struct node{
    int l,r;
    bool operator<(const node & a)const {
        if(a.r != r)
            return r < a.r;
        return l < a.l;
    }
}s[maxn];

int main ()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d %d",&s[i].l,&s[i].r);
    sort(s,s+n);
    int ans = s[0].r,res =1;
    for(int i=1;i<n;i++){
        if(ans <= s[i].l){
            ans = s[i].r;
            res++;
        }
    }
    printf("%d\n",res);
    return 0;
}
时间: 2024-11-05 13:41:22

51NOD 1133 不重叠的线段的相关文章

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示例

51nod 1364 最大字典序排列(线段树)

1364 最大字典序排列基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出一个1至N的排列,允许你做不超过K次操作,每次操作可以将相邻的两个数交换,问能够得到的字典序最大的排列是什么? 例如:N = 5, {1 2 3 4 5},k = 6,在6次交换后,能够得到的字典序最大的排列为{5 3 1 2 4}. Input 第1行:2个数N, K中间用空格分隔(1 <= N <= 100000, 0 <= K <= 10^9). 第2至N + 1行

51nod 1463 找朋友(线段树+离线处理)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1463 题意: 思路: 好题! 先对所有查询进行离线处理,按照右区间排序,因为k一共最多只有10个,所有在该区间内的B数组,每次枚举K值,通过这样的方式来得到另外一个B值.但是这样得到的B值它在B数组中的位置必须在当前数的左边.如下图:(j为当前数在B数组中的位置,pos为计算得到的另一个B值在数组中的位置) 这两个数的和记录在pos中,这里pos的位置必须在j的左边,假

不重叠的线段

X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的线段.(注:起点或终点重叠,不算重叠). 例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠. 思路:贪心,就是以前的安排节目的题目,在这里将线段末端点按照从小到大排序,就跟哪个活动结束早哪个先安排 #include <iostream> #include <cstdio> #include <algorithm> #include <string>

51nod 1611 金牌赛事(动态规划 + 线段树)

分析:看起来有点像最大权闭合图,然而复杂度太高... 正解是dp,设dp[i]为考虑前i条路的最大收益,则dp[i]=max{dp[j] - cost[j+1][i] + earn[j+1][i]},0<=j<=i-1,earn[j+1][i]表示在[j+1,i]之间的比赛,是个O(n^2)的dp. 接下来考虑优化这个dp.维护一个线段树,当扫到i时,树中满足a[j] = dp[j] - cost[j+1][i] + earn[j+1][i],先将比赛按右端点排序,然后每扫到一个右端点为i的比

51nod 1463 找朋友 (扫描线+线段树)

1463 找朋友  基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 给定: 两个长度为n的数列A .B 一个有m个元素的集合K 询问Q次 每次询问[l,r],输出区间内满足|Bi-Bj|∈K 的最大Ai+Aj 数据约定: n,Q<=100000 m <= 10 0<=A[i]<=1000000000 1<=B[i]<=n 1<=K[i]<=n 保证B[i]互不相等 Input n Q m A1 A2 .

矩阵重叠面积计算 线段树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>是一样的 按照结束时间(线段末尾排序),依次添加不重叠的线段即可 因为已经先按照结束时间排序,结束时间相同的按照开始时间排序,这样选择最早结束的一定不会使结果更