zoukankan      html  css  js  c++  java
  • 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest ---E题Entertainment Box(有点变化的贪心)

    提交链接

    http://codeforces.com/gym/100781/submit

    Description:

        Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fights they have finally decided to buy a video tape recorder. This fabulous, new device can record k different TV shows simultaneously, and whenever a show recorded in one the machine’s k slots ends, the machine is immediately ready to record another show in the same slot.

        The three friends wonder how many TV shows they can record during one day. They provide you with the TV guide for today’s shows, and tell you the number of shows the machine can record simultaneously. How many shows can they record, using their recording machine? Count only shows that are recorded in their entirety.

    Input

        The first line of input contains two integers n, k (1 ≤ k < n ≤ 100 000). Then follow n lines, each containing two integers xi , yi , meaning that show i starts at time xi and finishes by time yi . This means that two shows i and j, where yi = xj , can be recorded, without conflict, in the same recording slot. You may assume that 0 ≤ xi < yi ≤ 1 000 000 000.

    Output

        The output should contain exactly one line with a single integer: the maximum number of full shows from the TV guide that can be recorded with the tape recorder.

    Sample 1:

    3 1

    1 2

    2 3

    2 3

    2

    Sample 2:

    4 1

    1 3

    4 6

    7 8

    2 5

    3

    Sample 3:

    5 2

    1 4

    5 9

    2 7

    3 8

    6 10

    3

    题意:输入n,k 表示有n场电视节目,最多可以同时录制k场,然后n行输入电视节目的起始时间和结束时间,注意(x1,y1) (x2,y2) y1==x2 不算重叠,求能录制的最多数量;

    思路:定义多重集合 multiset<int>q;  插入k个0,表示同时录制时已经录制完部分电视节目的结束时间,把n个电视节目按结束时间排序,依次进行处理,如果当前电视节目的起始时间比集合中的k个数都要小,则表示当前节目不能放在k个节目任何一个节目后录制,则跳过;否则,在k个结束时间中找一个小于等于(最接近的,贪心原则)当前节目开始时间的值,然后删掉更新为当前节目的结束时间;

    感悟:我做这道题时,一直没往这个方向想,唉,太智障了~

    代码如下:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <set>
    using namespace std;
    struct Node
    {
        int s,e;
    }node[100005];
    bool cmp(const Node x,const Node y)
    {
        if(x.e==y.e) return x.s>y.s;
        return x.e<y.e;
    }
    multiset<int>q;
    multiset<int>::iterator it;
    int main()
    {
        int n,k;
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            q.clear();
            for(int i=0;i<n;i++)
                scanf("%d%d",&node[i].s,&node[i].e);
            sort(node,node+n,cmp);
            for(int i=0;i<k;i++)
            q.insert(0);
            int sum=0;
            for(int i=0;i<n;i++)
            {
                it=q.upper_bound(node[i].s);
                if(it==q.begin()) continue;
                it--;
                q.erase(it);
                q.insert(node[i].e);
                sum++;
            }
            cout<<sum<<endl;
        }
    }
  • 相关阅读:
    HTTPD之五---HTTP协议、相关工具及状态码
    HTTPD之四----实现HTTPD正向代理与反向代理
    第十三周---DNS原理、实现智能DNS及源码编译mariadb数据库
    DNS之五----实现智能DNS
    sqoop 导入增量数据到hive
    Hadoop 二次排序
    Spark foreachpartiton和mappartition的异同
    hadoop 实现多文件输出
    spark 实现多文件输出
    Scala 中 call by name & call by value 的区别
  • 原文地址:https://www.cnblogs.com/chen9510/p/5857762.html
Copyright © 2011-2022 走看看