zoukankan      html  css  js  c++  java
  • E. Printer 夜

    http://codeforces.com/contest/253/problem/E

    对优先级进行二分  每次给一个优先级就模拟一下看是否合格 不合格就二分调整

    需要注意的地方 所给T的范围会超 int (就是这点敲代码时忽略了 wa 了很久 细节呀)  还有就是优先级没有重的情况

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<vector>
    #include<stack>
    #include<set>
    #include<map>
    #include<queue>
    #include<algorithm>
    #define LL long long
    using namespace std;
    const int N=50005;
    struct node
    {
        LL t,s,p;
        int I;
        bool operator <(node x)const
        {
            return p<x.p;
        }
    }mem[N];
    priority_queue<node>qt;
    int K;
    LL ans[N];
    set<LL>st;
    bool cmp(node x,node y)
    {
        return x.t<y.t;
    }
    LL run(int p,int n)
    {
        mem[K].p=p;
        int k=mem[K].I;
        int l=0;
        LL tnow=0;
        while(!qt.empty()||l<n)
        {
            if(l<n&&qt.empty())
            {qt.push(mem[l]);tnow=mem[l].t;++l;}
            while(l<n)
            {
                if(mem[l].t==tnow)
                {qt.push(mem[l]);++l;}
                else
                break;
            }
            node tmp=qt.top();
            qt.pop();
            while(l<n)
            {
                if(mem[l].t-tnow<tmp.s&&mem[l].p<tmp.p)
                {qt.push(mem[l]);++l;}
                else
                break;
            }
            if(l==n||mem[l].t-tnow>=tmp.s)
            {
                tnow+=tmp.s;
                tmp.s=0;
            }else
            {
                tmp.s-=(mem[l].t-tnow);
                tnow=mem[l].t;
            }
            if(tmp.s==0)
            {
                ans[tmp.I]=tnow;
            }else
            {
                qt.push(tmp);
            }
        }
        return ans[k];
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            st.clear();
            for(int i=0;i<n;++i)
            {
                cin>>mem[i].t>>mem[i].s>>mem[i].p;
                mem[i].I=i;
                st.insert(mem[i].p);
            }
            LL T;
            cin>>T;
            sort(mem,mem+n,cmp);
            for(int i=0;i<n;++i)
            if(mem[i].p==-1)
            K=i;
            LL l=1,r=1e9,mid;
            while(st.find(l)!=st.end())
            ++l;
            while(st.find(r)!=st.end())
            --r;
            while(l<=r)
            {
                mid=(l+r)>>1;
                while(st.find(mid)!=st.end())
                ++mid;
                LL t=run(mid,n);
                if(t==T)
                break;
                if(t<T)
                r=mid-1;
                else
                l=mid+1;
                if(st.find(l)!=st.end())
                ++l;
                while(st.find(r)!=st.end())
                --r;
            }
            cout<<mem[K].p<<endl;
            for(int i=0;i<n;++i)
            cout<<ans[i]<<" ";
            printf("\n");
        }
        return 0;
    }
    

      

  • 相关阅读:
    Kaffeine Player:固守丰富的媒体播放器
    GIMP 2.2.15
    基于终真个常用工具
    运用 GNOME Specimen 检查字体
    LINA:让 Linux 使用法度圭表标准在 Windows 和 Mac OS X 上运转
    Openbox 3.4 公布
    DB2 9 运用拓荒(733 查验)认证指南,第 1 局部: 数据库器材与编程步伐(1)
    Wammu-挪动电话治理器
    会计人员必去十大网站(最新)
    判断一个数组的长度用 Length 还是 SizeOf ?
  • 原文地址:https://www.cnblogs.com/liulangye/p/2813433.html
Copyright © 2011-2022 走看看