zoukankan      html  css  js  c++  java
  • 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-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
    ",Q.size());
    
        return 0;
    }
    View Code
  • 相关阅读:
    centos6升级内核
    centos7启动盘制作
    sed匹配字符串并将匹配行的后几行注释
    cmd下调用xshell登录linux服务器
    centos清除历史命令
    yum错误Cannot retrieve metalink for repository: epel/x86_6
    ansible-playbook
    jdk升级到1.8
    shell瞎记录
    shell 循环
  • 原文地址:https://www.cnblogs.com/TreeDream/p/7064052.html
Copyright © 2011-2022 走看看