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;
        }
    }
  • 相关阅读:
    Linux虚拟机突然不能上网了
    项目经验不丰富、技术不突出的程序员怎么打动面试官?
    10分钟看懂!基于Zookeeper的分布式锁
    BATJ等大厂最全经典面试题分享
    分享30道Redis面试题,面试官能问到的我都找到了
    一个六年Java程序员的从业总结:比起掉发,我更怕掉队
    我是这样手写 Spring 的(麻雀虽小五脏俱全)
    自述:为什么一部分大公司还在采用过时的技术,作为技术人而言该去大公司还是小公司
    Java精选面试题之Spring Boot 三十三问
    Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)
  • 原文地址:https://www.cnblogs.com/chen9510/p/5857762.html
Copyright © 2011-2022 走看看