zoukankan      html  css  js  c++  java
  • P1803 凌乱的yyy【洛谷】

    //题目-----------------------------------------------------------------------------------------

    传送门: http://www.luogu.org/problem/show?pid=1803

    P1803 凌乱的yyy

    题目背景

    快noip了,yyy很紧张!

    题目描述

    现在各大oj上有n个比赛,每个比赛的开始、结束的时间点是知道的。

    yyy认为,参加越多的比赛,noip就能考的越好(假的)

    所以,他想知道他最多能参加几个比赛。

    由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加2个及以上的比赛。

    输入输出格式

    输入格式:

    第一行是一个整数n ,接下来n行每行是2个正整数ai,bi(ai<bi),表示比赛开始、结束的时间。

    输出格式:

    一个整数最多参加的比赛数目。

    输入输出样例

    输入样例#1:
    3
    0 2
    2 4
    1 3
    
    输出样例#1:
    2
    

    说明

    对于20%的数据,n≤10;

    对于50%的数据,n≤1000;

    对于70%的数据,n≤100000;

    对于100%的数据,n≤1000000,0≤ai<bi≤1000000。

    //解题-----------------------------------------------------------------------------------------

    此题很明显就是把活动安排问题改了一下,是简单的贪心【至今不敢切DP, T_T

    首先将结束时间从小到大排个序,【保证结束时间不冲突

    选第一个任务,然后ans加1, 最小的结束时间赋值给ben 【蕴含深意。。

    接着从第二小的往后判断每个比赛的开始时间是不是大于等于ben【只有大于等于ben,才保证开始时间不会冲突

    如果是,就增加ans,最后输出结果ans就可以啦

    //几个要注意的地方:(1)n的范围有点。。所以得用快排,刚开始的冒泡TLE了

    //                         (2)选择第一个不能  和  选择其它的一样  在for循环里 那样的判断(即大于等于ben),因为可能开始时间为负数qwq

    //代码-----------------------------------------------------------------------------------------

    program lingluandeyyy;
    //-------------------------------------------------------------------------------
    var
        i,n,ans,ben:longint;
        a,b:array[1..1000000] of longint;
    //-------------------------------------------------------------------------------
    procedure sort(l,r: longint);
    var
        i,j,x,y: longint;
    begin
        i:=l;
        j:=r;
         x:=b[(l+r) div 2];
        repeat
           while b[i]<x do inc(i);
           while x<b[j] do dec(j);
           if not(i>j) then
                 begin
                    y:=a[i];     a[i]:=a[j];      a[j]:=y;
                    y:=b[i];     b[i]:=b[j];      b[j]:=y;
                    inc(i);         j:=j-1;
                 end;
        until i>j;
        if l<j then sort(l,j);
        if i<r then sort(i,r);
    end;
    //-------------------------------------------------------------------------------
    begin
        readln(n);
        for i:= 1 to n do
            readln(a[i],b[i]);
        sort(1,n);
        ben:=b[1];
        ans:=1;
        for i:= 2 to n do
           if a[i]>=ben then begin
                               Inc(ans);
                               ben:=b[i];
                             end;
        writeln(ans);
    end.
  • 相关阅读:
    How To Build CyanogenMod Android for smartphone
    CentOS安装Code::Blocks
    How to Dual boot Multiple ROMs on Your Android SmartPhone (Upto Five Roms)?
    Audacious——Linux音乐播放器
    How to Dual Boot Multiple ROMs on Your Android Phone
    Everything You Need to Know About Rooting Your Android Phone
    How to Flash a ROM to Your Android Phone
    什么是NANDroid,如何加载NANDroid备份?
    Have you considered compiled a batman-adv.ko for android?
    BATMAN—Better Approach To Mobile Adhoc Networking (B.A.T.M.A.N.)
  • 原文地址:https://www.cnblogs.com/bobble/p/5927845.html
Copyright © 2011-2022 走看看