[HDU2037]贪心入门

今年暑假不AC

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 43909    Accepted Submission(s): 23436

Problem Description

“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”

确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。

为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、
超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)

Input


入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据
Ti_s,Ti_e
(1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。

Output

对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

Sample Input

12

1 3

3 4

0 7

3 8

15 19

15 20

10 15

8 18

6 12

5 10

4 14

2 9

0

Sample Output

5

Author

lcy

根据结束时间升序排序,做贪心,选择,即每次都选择最早结束的(当然要start >= end)

Java Code:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void sort( List<Obj> list ) {
        Collections.sort( list, new Comparator<Obj>() {

            public int compare( Obj o1, Obj o2 ) {
                    return o1.end - o2.end;
            }
        } );
    }

    public static void main( String[] args ) {
         List<Obj> list;
         Scanner sc = new Scanner(System.in);
         int n;
         while(sc.hasNext()){
             n = sc.nextInt();
             if(n==0) return;
            list = new ArrayList<Obj>();
             while(n>0){
                 int start = sc.nextInt();
                 int end = sc.nextInt();
                 Obj obj = new Obj( start, end, end-start );
                 list.add( obj );
                 n--;
                 sort(list);
             }
             System.out.println(solve(list));
         }
    }

    private static int solve( List<Obj> list ) {
        int max = 1;
        int end = list.get(0).end;
        for(int i=0;i<list.size();i++){
            if(list.get( i ).start >= end){
                end = list.get( i ).end;
                max++;
            }
        }
        return max;
    }

}

class Obj {

    public int start;

    public int end;

    public int dur;

    public Obj( int start, int end, int dur ) {
        this.start = start;
        this.end = end;
        this.dur = dur;
    }
}
时间: 2024-10-08 00:45:45

[HDU2037]贪心入门的相关文章

贪心入门——活动安排问题

贪心入门的几个例题来自51nod 问题描述 有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) 输出 输出最多可以选择的线段数量. 输入示例 3 1 5 2 3 3 6 输出示例 2 求解思路 按照活动的结束时间早的优先 算法代码 #include <

[贪心入门]活动安排问题之二

有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? 分析:能否按照之一问题的解法,每个教室安排尽可能多的活动,即按结束时间排序,再贪心选择不冲突的活动,安排一个教室之后,剩余的活动再分配一个教室,继续贪心选择…… 反例: A:[1,2)  B:[1,4) C:[5,6) D:[3,7) 已经按结束时间排好顺序,我们会选择教室1: A C教室2:  B教室3:  D需要3个教室.但是如果换一种安排方法,我们可以安排AD在一个教室,而BC在

[贪心入门]活动安排问题

有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 分析: 我们就是想提高教室地利用率,尽可能多地安排活动.考虑容易想到的几种贪心策略: (1) 开始最早的活动优先,目标是想尽早结束活动,让出教室.然而, 这个显然不行,因为最早的活动可能很长,影响我们进行后面的活动.例如活动开始和结束时间分别为[0, 100), [1,2) ,[2, 3), [3, 4),[4,5],安排[0,100)的这个活动之后,其他活动无法安排,可是最优解是安排

POJ3614 Sunscreen 贪心入门

题目大意 给出一些区间和一些点,一个点如果在一个区间内,那么此两者可以匹配.问匹配数最大是多少. 题解 这样的题我们一般都是站在区间上去找与其配对的点.我们可以得到如下性质: 对于一段区间\([l_1,r_1]\)的任意两点\(a,b, a<b\),它们对于任意一个区间\([l_2,r_2],l_2<l_1\),\(a\in[l_2,r_2]\)的可能性(以后用P表示)\(P(a\in[l_2,r_2])>P(b\in[l_2,r_2])\). 什么叫"可能性大"呢?

hdu 1009 贪心入门

Mycode: compile error,i don't know why? #include <iostream> #include<algorithm> #include<cstdio> #define maxn 10005 using namespace std; struct room { int j; int f; double val; }; struct room r[3001]; bool compare(struct room a,struct ro

贪心入门——独木舟

问题 n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 输入 第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重. 接下来n行,每行一个正整数,表示每个人的体重.体重不超过1000000000,并且每个人的体重不超过m. 输出 一行一个整数表示最少需要的独木舟数. 输入示例 3 6 1 2 3

贪心法_2(草稿)

51Nod贪心入门教程_任务执行顺序 有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分 最后储存计算结果需要占据O[i]个空间(O[i] < R[i]) 例如: 执行需要5个空间,最后储存需要2个空间 给出N个任务执行和存储所需的空间,问执行所有任务最少需要多少空间 分析: 本题可以抽象成,从一个整数开始,每次减去a,再加上b (a,b都是正数),要求每次操作都不产生负数 针对本题a[i] = R[i], b[i] = R[i] – O[i],注意O[i] < R[i],

贪心法_1 2016.5.16

所谓"贪心算法"是指: 在对问题求解时,总是作出在当前看来是最好的选择 也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明) 特别说明: 若要用贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就是最优解!! 贪心算法不是对所有问题都能得到整体最优解 关键是贪心策略的选择,选择的贪心策略必须具备无后效性 即某个状态以前的过程不会影响以后的状态,只与当前状态有关 贪心算法的证明 贪心算法的正确性,必须有严格意义的证明,一般

HDU2037 今年暑假不AC 【贪心】

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27470    Accepted Submission(s): 14499 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" &quo