zoukankan      html  css  js  c++  java
  • 蚯蚓【D2 T2】

    测评传送门

    题意:

    n 只蚯蚓,m 秒后,每秒递增 q,p=u/v 切的系数,t 询问系数

    输入
    3 7 1 1 3 1
    3 3 2
    输出
    3 4 4 4 5 5 6
    6 6 6 5 5 4 4 3 2 2
     

     思路:

    每次取最长的蚯蚓,优先队列很好想。

    但本题一个麻烦之处在于如何更新队列中蚯蚓的状态,也就是不断递增。

    因为当我们取要切的蚯蚓时,它在这一秒是不增的,而队列中是递增的。我们其实可以只记录一下总共增的,因为大家都在增,相对的,大家都不变。

    关键是处理切的这个蚯蚓:

    队列里的其实都在增,只是相对不变,而“我”在这一秒切完后是不增的,相对的,“我”就是在减【最后会加回来】

    然后就有85分啦:

    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #include<math.h>
    #define db double 
    using namespace std;
    const int mxn=1e7;
    int n,m,t,d;
    double u,v;
    int tot,tim[mxn],a[mxn];
    priority_queue<int> q;
     
    void file() {
        freopen("earthworm.in","r",stdin);
        freopen("earthworm.out","w",stdout);
    }
    
    int main() 
    {
    //    file();
        scanf("%d%d%d%lf%lf%d",&n,&m,&d,&u,&v,&t);
        double p=u/v;
        for(int i=1;i<=n;++i) {
            int x;scanf("%d",&x);
            q.push(x);
        }    
        for(int i=0;i<m;++i) {
            int x=q.top()+tot;q.pop();
            tim[i+1]=x;
            int s1=floor((db)x*p);
            int s2=x-s1;
            s1=s1-tot-d;s2=s2-tot-d;
            q.push(s1);q.push(s2);
            tot+=d;
        }
        for(int i=t;i<=m;i+=t) 
            printf("%d ",tim[i]);
        printf("
    ");
        for(int i=1;i<=n+m;++i) {
            if(i%t==0) {
                printf("%d ",q.top()+tot);
            }
            q.pop();
        }
        return 0;
    }

    什么?这还不是正解?

    因为我们调用的是STL的优先队列,就要考虑是否超时的问题。

    原来的基础上加上一个显然的结论,就能避免多次使用优先队列导致TLE

    后切的蚯蚓一定比先切的短

    对于切过的蚯蚓,只需要用普通的队列就行啦

    100分代码

    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #include<math.h>
    #define db double 
    using namespace std;
    const int mxn=1e7;
    int n,m,t,d,h=1,h1=1,h2=1,t1,t2;
    double u,v;
    int tot,tim[mxn],a[mxn],c1[mxn],c2[mxn];
    priority_queue<int> q;
    bool cmp(int x,int y) {
        return x>y;
    }
     
    void file() {
        freopen("earthworm.in","r",stdin);
        freopen("earthworm.out","w",stdout);
    }
    
    int main() 
    {
    //    file();
        scanf("%d%d%d%lf%lf%d",&n,&m,&d,&u,&v,&t);
        double p=u/v;
        for(int i=1;i<=n;++i) scanf("%d",&a[i]);
        sort(a+1,a+1+n,cmp);
        int x;
        for(int i=0;i<m;++i) {
            if(h>n) {
                if(c1[h1]>c2[h2]) x=c1[h1++]+tot;
                else x=c2[h2++]+tot;
            }
            else if(a[h]>=c1[h1] && a[h]>=c2[h2]) x=a[h++]+tot;
            else if(c1[h1]>c2[h2]) x=c1[h1++]+tot;
            else x=c2[h2++]+tot; 
             tim[i+1]=x;
            int s1=(db)x*p;
            int s2=x-s1;
            s1=s1-tot-d;s2=s2-tot-d;
            c1[++t1]=s1,c2[++t2]=s2;
            tot+=d;
        }
        for(int i=t;i<=m;i+=t) 
            printf("%d ",tim[i]);
        printf("
    ");
        for(int i=h1;i<=t1;++i) q.push(c1[i]);
        for(int i=h2;i<=t2;++i) q.push(c2[i]);
        for(int i=h;i<=n;++i) q.push(a[i]);
        
        for(int i=1;i<=n+m;++i) {
            if(i%t==0) {
                printf("%d ",q.top()+tot);
            }
            q.pop();
        }
        return 0;
    }
  • 相关阅读:
    网络七层
    微信小程序开发工具 常用快捷键
    BZOJ 1026 windy数 (数位DP)
    BZOJ 1026 windy数 (数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3709 Balanced Number (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
  • 原文地址:https://www.cnblogs.com/qseer/p/9845276.html
Copyright © 2011-2022 走看看