zoukankan      html  css  js  c++  java
  • 2016.9.24初中部上午NOIP普及组比赛总结

    2016.9.24初中部上午NOIP普及组比赛总结

    2016.09.24【初中部 NOIP普及组 】模拟赛
    其实这次我没比赛,早上去参加亲子活动去了。
    不过在下午我做完了所有的题,感觉还好。


    进度
    现在:AC+AC+AC+AC=AK


    题目

    一、采药
    弄了大半天。。结果发现这是个简单的错误
    题目简化
    给出每样物品的重量、体积、价值。
    求不超过重量、体积的最大价值。
    最初思路
    马上想到背包,只不过这多了一个体积。
    设f[i,j,k]表示到第i个物品时重j体积k。
    和之前一样的:
    f[i,j,k]:=f[i-1,j,k];
    f[i,j,k]:=max(f[i,j,k],f[i-1,j-zl[i],k-tj[i]]+jz[i]);
    要判断是否能装得下,才能执行。
    错因
    很冤啊!max函数用的是longint!应是int64
    正解
    刚才的方法可以(数组尽量开大)。
    也可以将数组降维(记得 总重or总体积downto物品的重量or体积)
    降维就不需要判断是否能装了,
    还能省空间(我会告诉你我一直都没降过维吗?)。

    还有郑少怀同学的方法:
    不要想,使劲递归
    参数为l(到哪里),ans(不建议用ans做名称)(现在价值)
    ,现在质量,现在体积
    不加记忆化,就过了
    数据水~~~~~~~~~~~)


    二、DNA排序
    挺考语文的,我看了半天才懂。。
    题目简化
    如果a[j]>a[i]且i>j就称为一个逆序对。
    那什么碱基的没鬼用
    无序度为逆序对的个数。
    然后以无序度为关键字从小到大排个序。
    如果并列便让先读入的放前面。
    最初思路
    暴力地求出无序度,
    然后存起来(读入顺序也要)。
    然后qsort
    正解
    看上面↑
    可以用数组用记录类型存放每个的串、无序度、读入顺序
    以无序度为关键字,读入顺序为次关键字,
    qsort一下。


    三、取物品
    这题做得特爽,用了我自创的方法。
    题目简化
    n个数中取k个数的方案数,同样的算一个
    最初思路
    爆搜。。。
    用两个参数:到哪里(l)和取多少个(m)。
    go(1,0);
    优化1:
    可是数据特别坑,一下子就是九百几。
    从一到九百很麻烦。。。。。
    所以我发现,其实编号只是为了表明几个数同一组而已。

                read(x);
                if bz[x]=0 then
                begin
                        inc(a[0]);
                        bz[x]:=a[0];
                        inc(a[bz[x]]);
                end else
                begin
                        inc(a[bz[x]]);
                end;

    a[0]为编号总共的种类数,
    bz[x]如果为0,则之前没出现过。如果不为零,表示x编号在a的位置
    然后就很好转化成一个很小的东西。
    加了这个优化80分。
    错因
    时超。
    正解
    优化二:
    把它改作递归的形式,记忆化会方便很多。
    优化一不需要改。
    边界:
    当l=a[0]+1,看看m是否凑够k个,
    凑够了就exit(1),否则exit(0)。
    递归式:go:=sum(go(l+1,m+i)); 0<=i<=a[l],k-m{其中最小的,k-m是剩下要刷的}
    接着是记忆化部分:
    bz[i,j]表示到i时刷了j个数之后的方案数。(可以理解为go(i,j)的值)
    bz2[i,j]表示到bz[i,j]之前有没有走过。
    如果走过了,就exit(bz[l,m]);
    否则到其他的exit之前(你可以假设子程序末尾有一个exit(go)),
    bz[l,m]:=go;bz2:=true;
    以上便是优化二,能省去一些之前算过的、多余的步骤。
    就可以AC了。

    然后我再说说递推的方法:
    优化一可以不变。(变了应该会慢一些,随便你)
    设f[i,j]表示到第i个种类取了j个时的方案数(与bz[i,j]差不多是相反的)
    初始化:a[i,0]:=1; (0<=i<=a[0])
    递推式:f[i,j]:=sum(f[i-1,j-l]);
    (1<=i<=a[0]{一共的种类数,如果不加优化一就是序号最大的种类})
    (1<=j<=n)(0<=l<=min(a[i],j))
    输出f[a[0],k]。


    四、Note
    This problem is really veryvery water.But it is veryvery keng,too.
    题目简化
    从左上角到右下角,只能下或右,要求经过的数最小。
    最初思路
    没用留意到只能向下或右,觉得这是有后效性的,
    假装机智地用了爆搜加记忆化。
    方向上下左右
    如果超界退出
    如果到这个点没之前的少或和之前的相等,便退出,
    否则更新。
    错因
    如果我蠢一点,也没看到那句话,就一下子对了。
    当没有看见那句话时
    傻子:向下或右走最优!
    自作聪明人:可能绕其他的路最优!
    事实证明:只能向下或向右!(原来D也傻!
    分享一个极端数据(XZB送我的):
    3 5
    0 20 1 1 1
    1 20 1 20 1
    1 1 1 20 0
    ans=24,not 9!
    这题告诉我们:要审题
    正解
    爆搜绝对能对,把方向改为两个就好了。
    (这题我分不清是递推还是动态规划,应该是动态规划):
    像数字三角形(或者说一样)的解法,
    因为这题并没有后效性,
    f[i,j]表示到i行j列时的最小的和。
    f[i,1]:=f[i-1,1]+a[i,1];
    f[1,j]:=f[1,j-1]+a[1,j];
    因为只能从上面或左边过来
    f[i,j]:=min(f[i-1,j],f[i,j-1])+a[i,j];
    (2<=i<=n)(2<=j<=m)
    输出f[n,m]。


    题外话:
    1. 爆搜,是解题时的一盏明灯;记忆化,使解题时明灯的光更加明亮。
    2. 要审题。
    3. 题目中有很多东西是没啥用的,要简化。比如三题的优化一。
    4. 语文要学好。
    5. 要细心,不要犯第一题的低级错误。
    6. 要懂得举一反三。


  • 相关阅读:
    Direct3D 光照和材质
    UGUI 过渡动画插件,模仿NGUI的Tween (转载)
    Unity 功夫猫
    LinkedList和List在三种简单算法中效率比较
    学习Modern UI for WPF
    H3 BPM Sheet表单 NTKO功能使用说明
    H3 BPM MVC表单SheetOffice控件使用分享
    H3 BPM初次安装常见错误详解5-7
    吕学敏:全面、细致功能锻造灵活审批
    华陆工程——业务流程管理方案
  • 原文地址:https://www.cnblogs.com/jz-597/p/11145334.html
Copyright © 2011-2022 走看看