zoukankan      html  css  js  c++  java
  • HihoCoder 1309

    题意:输入n,n行每行两个数分别为起始时间和终止时间,一台机器在一个时间段只能完成一项工作,

    求完成n项工作至少需要几台机器。

    第一种解法:优先队列将起始时间从小到大排列,将起始最早的结束时间压入队列,如果它小于下一个的起始时间,出队,下一个结束时间入队

    否则下一个结束时间直击入队,结束,统计队列中元素个数即可。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int maxn=1e6+100;
    priority_queue<int,vector<int>,greater<int> >q;//从大到小的优先队列 
    pair<int,int>x[maxn]; 
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d",&x[i].first,&x[i].second);
            }
            sort(x,x+n+1);//先按开始时间排序,开始相等按结束排序 
            q.push(0);
            for(int i=1;i<=n;i++)
            {
                if(q.top()<=x[i].first)
                {
                    q.pop();
                    q.push(x[i].second);
                }
                else 
                    q.push(x[i].second);
            }
            cout<<q.size()<<endl;
        }
    }

    第二种解法 由于数据较大,但点的个数有限,需将各点离散化,去重,标记左右端点类比前缀和求解。

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm> 
    using namespace std;
    #define maxn 200005
    typedef pair<int,int>P;
    P a[maxn];
    vector<P>vec;
    int temp[maxn];
    int n;
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            int len=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d",&a[i].first,&a[i].second);
                temp[len++]=a[i].first;//离散化 
                temp[len++]=a[i].second;//temp数组保存的只有输入的 左右端点 
            }
            sort(temp,temp+len);//排序 
            len=unique(temp,temp+len)-temp;//去重 
            for(int i=1;i<=n;i++)
            {
                int x=lower_bound(temp,temp+len,a[i].first)-temp;//查找左右端点 在temp数组中的位置 
                int y=lower_bound(temp,temp+len,a[i].second)-temp;//x,y 返回下标 
            //    cout<<x<<" "<<y<<" "<<temp[x]<<" "<<temp[y]<<endl;
                vec.push_back(P(x,1));//标记端点 左or右 
                vec.push_back(P(y,-1));
            }
            sort(vec.begin(),vec.end());//按端点大小排序 
            //cout<<vec.size()<<endl;
            int ans=0,cnt=0;
            //类比前缀和 
            for(int i=0;i<vec.size();i++) 
            {
                if(vec[i].second==1)//左端点 
                {
                    ans++;
                    //cout<<temp[vec[i].first]<<" "<<ans<<endl; 
                    cnt=max(ans,cnt); 
                }
                else
                    ans--;
            }
            cout<<cnt<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Bandit Wargame Level18 Writeup(interactive shell and .bashrc )
    Bandit Wargame Level12 Writeup
    Natas Wargame Level25 Writeup(头部注入+POST/GET注入)
    Mybatis 加载 Mapper配置的四种方式
    设计模式(四)---- 代理模式
    execute() 和 sumbit() 的区别
    Executors提供的四种线程池
    线程的三种实现方法
    同一个线程多次调用start()会出现的问题
    线程的介绍
  • 原文地址:https://www.cnblogs.com/renwjing/p/7327377.html
Copyright © 2011-2022 走看看