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;
    }
}
原文地址:https://www.cnblogs.com/chen9510/p/5857762.html