hiho 第155周 任务分配

最小路径覆盖会超时;

贪心思路:

按照开始时间排序,然后根据结束时间,维护一个以结束时间的单调递增的队列,每次与最快结束的任务进行比较即可;

/*
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>

using namespace std;

const int maxn = 100000+5;

struct BPM {
    int n,m;
    vector<int> G[maxn];
    int left[maxn];
    bool T[maxn];

    int right[maxn];
    bool S[maxn];

    void init(int n,int m) {
        this->n = n;
        this->m = m;
        for(int i=0;i<n;i++)
            G[i].clear();
    }

    void AddEdge(int u,int v) {
        G[u].push_back(v);
    }

    bool match(int u) {
        S[u] = true;
        for(int i=0;i<G[u].size();i++) {
            int v = G[u][i];
            if(!T[v]) {
                T[v] = true;
                if(left[v]==-1||match(left[v])) {
                    left[v] = u;
                    right[u] = v;
                    return true;
                }
            }
        }
        return false;
    }

    int solve() {
        memset(left,-1,sizeof(left));
        memset(right,-1,sizeof(right));
        int ans = 0;
        for(int u=0;u<n;u++) {
            memset(S,0,sizeof(S));
            memset(T,0,sizeof(T));
            if(match(u))
                ans++;
        }
        return ans;
    }

}sol;

struct Node {
    int s,e;
}node[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    sol.init(n,n);
    for(int i=0;i<n;i++)
        scanf("%d%d",&node[i].s,&node[i].e);

    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
            if(node[i].e<=node[j].s)
                sol.AddEdge(i,j);
            else if(node[i].s>=node[j].e)
                sol.AddEdge(j,i);

    printf("%d\n",n-sol.solve());

    return 0;
}
*/

#include <bits/stdc++.h>

using namespace std;

const int maxn = 100000+5;

struct Node {
    int s,e;
    bool operator < (const Node & rhs) const {
        return s < rhs.s;
    }
}node[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d%d",&node[i].s,&node[i].e);

    sort(node,node+n);

    priority_queue<int,vector<int>,greater<int> > Q;

    Q.push(node[0].e);
    for(int i=1;i<n;i++) {
        if(Q.top()<=node[i].s)
        {
            Q.pop();
            Q.push(node[i].e);
        }
        else Q.push(node[i].e);
    }
    printf("%d\n",Q.size());

    return 0;
}

时间: 2024-11-12 18:46:04

hiho 第155周 任务分配的相关文章

欧拉路径 提高篇 hiho第51周

题目链接:hiho 第51周 思路:首先特判n=1的情况,无输出.对于其他的按有向欧拉路径的求法把欧拉路径求出来以后,第一个按位全输出,接下来的的(2^n-1)个点,只需要输出二进制最后一位就可以了.详细的思路参考hiho 第51周 /************************************************************** Problem:hiho 第51周 User: youmi Language: C++ Result: Accepted Time:17m

欧拉路径 基础题 hiho第49周

题目链接:hiho 第49周 思路: 定义:给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 性质:  1: 一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点.  2: 若图中没有奇数度的点,那么起点和终点一定是同一个点,这样的欧拉路叫做欧拉回路 利用性质做题就好了,具体的模拟hiho讲的非常清楚了 /****************************************************

hiho 第1周 最长回文子串(manacher)

裸题.原理看代码很好理解的. 1 //hiho 第1周 2 #include <set> 3 #include <map> 4 #include <queue> 5 #include <deque> 6 #include <stack> 7 #include <cmath> 8 #include <cstdio> 9 #include <vector> 10 #include <string> 11

Fleury算法求欧拉路径 hiho第50周

题目链接: hiho一下 第五十周 思路:hiho已经讲的非常好了,我就不插嘴了. 提示:因为建边时同一条边同相反相的编号相近,比如(u-v)正向边u->v标号为0,反向边v->u标号为1,而0或1除以2都等于0,所以无论正反向建边,只要访问过正向反向中的任何一条边都可以用head[u]/2把原边标记为vis=1操作 /************************************************************** Problem:hiho 50 User: you

hiho一下116周 网络流

网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c(u,v).网络流的最大流问题求解的就是从s到t最多能有多少流量. 小Hi:那这个问题解决办法呢? 小Ho:解决网络流的基本思路就是寻找增广路,不断更新残留网络.直到找不到新的增广路,此时得到的

hiho一下 第一周 最长回文子串

时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

hihocoder155周 任务分配

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务. 同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行.任务切换不需要时间. 输入 第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目. 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 10000000

hiho一下 第二周&amp;第四周:从Trie树到Trie图

hihocoder #1014 题目地址:http://hihocoder.com/problemset/problem/1014 hihocoder #1036 题目地址: http://hihocoder.com/problemset/problem/1036 trie图其实就是trie树+KMP #1014trie树 #include<stdio.h> #include <algorithm> #include <cstring> #include <str