zoukankan      html  css  js  c++  java
  • NOIP模拟测试19考试反思

    这次考试是存在很大问题的,(如果不是T1T2出乎意料地A了,鬼知道会发生什么)

    T2A是情理之中,考试的时候测的极限数据跑的很快(无论m什么范围),但是T1真的。。。。。。

    T3没有分配太多的时间+没有看清题,WA0

    T1正解:这道题,只要有N/D个节点的size可以整除D,那么就可行。

    如果说某个节点的size可以整除D,那么当递归到这个节点的时候,一定会把这个节点的子树砍掉,而且砍掉的大小至少为D,则D*N/D即可

    主要想说一下T2的优化思路:

    基础:二分答案+检验O(n^2*log n)

    我们可以发现,在检验的时候,第一个区间是可以直接枚举的,这样就把枚举起点改成枚举第一个区间

    bool check(int tim){
        register int tot=0,tl=n+1,tr=n+1;
        register int now=a[n+1],cnt;
        while(now<=tim)tl--,now+=a[tl];now-=a[tl],tl++;
        while(now<=tim)tr++,now+=a[tr];now-=a[tr],tr--;
        while(tl!=n+2){
            cnt=2;tot=0;
            for(register int j=tr+1;j<=tl+n-1;j++){
                if(j+t<=tl+n-1&&sum[j+t]-sum[j-1]+tot<=tim){tot+=(sum[j+t]-sum[j-1]);j+=t;continue;}
                tot+=a[j];if(tot>tim)tot=a[j],cnt++;if(cnt>m){cnt=m+10;break;}
            }
            if(cnt<=m)return 1;
            now-=a[tl];tl++;while(now<=tim)tr++,now+=a[tr];now-=a[tr],tr--;
        }
        return 0;
    }                                    

    如代码所示,

    这个区间的数量是小于n的(先把左指针移动到最左,然后尽可能往右移动右指针,后面每次左指针右移一个,右指针再尽量扩展)

    这样就可以跑过m较大的数据(>100都可以),要是知道数据是2333我就不优化了但追求卓越的我们还要去跑过m较小的点,如果m比较小,那么分出来的区间就是比较大的,然后分块大法就应运而生。

    预处理出来前缀和,代码中的t就是根号n,即:能跳就直接跳,倍增思路也是类似。

    成功AC,比正解快一倍(逃)

    也许,当对正解毫无头绪的时候,优化暴力才是最好的做法。

    T3并不难(本来以为会有很多AK的23333333),却没有时间去思考了。

    时间分配

    下次加油吧

  • 相关阅读:
    SpringMVC听课笔记(一:SpringMVC概述)
    IDEA快捷键
    Java学习方法以及eclipse看jdk源码
    SpringMVC参数绑定
    正向代理、反向代理
    代理模式
    面试准备
    一致性哈希
    synchronized的底层探索
    哈夫曼编码
  • 原文地址:https://www.cnblogs.com/hzoi-kx/p/11347169.html
Copyright © 2011-2022 走看看