• p1459


    可能这是我的巅峰了吧.

    这题什么意思呢.

    有一堆数,m秒内总选取最大的一个下手:把它分成⌊x*u/v⌋和x-⌊x*u/v⌋.其他的都增长q;求每秒内的最大数和最后的所有剩下的数.

    (本题可以上一个优先队列很快的就水了,但是oj不允许哇.)

    考虑不增长的时候怎么做?我们来开三个队列.先把最开始的长度排序后放入第一个队列里,找到三个队头的最大值分一下后就分别扔到两个队列里.然后再找最大值...

    考虑为什么这样做是正确的.

    这是因为两个队列是历史上最大值分下来的,只要你放的顺序不变,先进入的一定是更大值分得的,比后进入的大.这样子三个队列内部都是递减的,而且二三个队列总大于新的最大值分到的.

    输出的时候就还是不断的对三个队列找最大值后输出.

    考虑增长的时候怎么做.

    可以利用差分的思想,或者说利用时间戳?我们记录每一个数分的时候的时间,也就是刚开始全部为1,23队列是循环的时候的i值.这样求值的时候只需把队列中的值加上q*(i-t)就好.然后分了之后重新记时间.

    输出的时候同理.

    就很开心的写了一个重载运算符.代码瞬间简洁(

    int i,t;
    int n,m,q,T;
    double u,v;
    int now,e1,e2,e3;
    struct aba:queue<int>
    {
        friend int operator + (const aba &a,const aba &t)
        {
            if(a.empty())//如果为空
                return -1000000;//交的时候没这么小,还好没卡我
            return a.front()+q*(i-t.front());//这是为什么下面输出的时候让i=m+1而让一个n控制循环的原因
        }
    }a1,a2,a3,t1,t2,t3,ans;
    inline int maxx()
    {
        e1=a1+t1;e2=a2+t2;e3=a3+t3;
        if(e1>=e2&&e1>=e3)
        {
            a1.pop();t1.pop();
            return e1;
        }
        if(e2>=e1&&e2>=e3)
        {
            a2.pop();
            t2.pop();
            return e2;
        }
        a3.pop();t3.pop();
        return e3;
    }
    int o[1000000];
    inline bool Orz(int a,int b)
    {
        return a>b;
    }
    int main()
    {
        n=read(),m=read(),q=read(),u=read(),v=read(),T=read();
        for(i=1;i<=n;i++)
            o[i]=read();
        sort(o+1,o+1+n,Orz);
        for(i=1;i<=n;i++){
            a1.push(o[i]);
            t1.push(1);
        }    
        for(i=1;i<=m;i++){
            now=maxx();
            if(i%T==0)
                write(now);
            a2.push(int(now*u/v)-q);
            t2.push(i);
            a3.push(now-int(now*u/v)-q);//注意取整的位置
            t3.push(i);
        }
        putchar(1);
        i=m+1;
        for(n=1;!a1.empty()|| !a2.empty()|| !a3.empty();n++){
            now=maxx();
            if(n%T==0)
                write(now);
        }
    }
  • 相关阅读:
    sqlserver中实现split分割字符串函数
    Sqlserver判断对象是否存在
    C#学习笔记(十):阴影和深度复制 [转]
    C#企业库自定义连接字符串.
    Jquery error 事件
    SQLserver不是可以识别的内置函数名称"的错误,通过set statistics time on能得到SQL语句的执行时间精确到毫秒.
    C#学习笔记(九):c#运算符重载.[简单理解]
    利用sql语句添加字段注释
    如何抓取google的搜索结果?
    SQL SERVER级联删除的简单实现方法
  • 原文地址:https://www.cnblogs.com/qywyt/p/9746532.html
Copyright © 2020-2023  润新知