2016.08.18【初中部 NOIP普及组 】模拟赛题解

马丹。。。严重翻车。。。

第二题十分第三题爆0第四题SPFA不会一维少30分。。。。。。。


下面进入正题:


T1

超水的递推,双重循环AC,就不细说了。


T2

盗版2048!!!!!


考试时莫名的就被坑了,只水了10分。。。

之后发现整个程序都是BUG。。。

之后又继续改。。。

又发现原来这是个盗版!!!

当2 2 4 8这种情况时,如果往左移,结果本来是16,结果这题非要弄成4 4 8,于是又被坑了。。。

之后又发现,判断游戏结束是要在每次循环一开始就判断,又被坑了。。。


正解:纯模拟,只要注意上面几点就可以了。

这题不难,重点是坑。。。


T4(T3最难,最后讲)

简单的SPFA。。。

结果因为不会一维又被坑了。。。


正解:

尽管空间是1000MB,然而我们如果用二位数组储存路径,内存早就炸上天了。

所以我们要用一种牛(wei)逼(suo)的方法把二维降为一维。

怎样降呢?


如果我们按照题目输入的数据记录,再把它复制一份相反方向的路线(因为是无向图),这样刚好不会爆空间。

但是这样的话,我们在进行SPFA时从一个节点扩展到另一个节点就会很麻烦,要把所有的边都枚举一遍。

这样就算后面的点时限是10秒,时间早也炸了。

但这样并不意味着这种方法是不可行的。


我们先一步步进行思考。

能否把节点按照大小排序,之后进行枚举再优化?

答案是可以的。

我们先对每一条边进行排序,之后再进行枚举。

如果发现前一个节点符合而后一个节点不符合,就可以退出循环。

但是这样还不是最优的。


我们记录第i个节点的第一条边的位置。

之后从这个位置枚举到(下一个节点的第一条位置-1),就可以把时间再次优化。


提示:在此题中,节点是从0~N的。。。

还有,数据很水。。。


T3

这题是要我们把U盘、鼠标和键盘组合成三种不同的礼包,然后(制杖)店长要求每相邻的两种礼包不能相同。

于是,我们就可以用贪心来解决这道题。


我们先把三种礼包编一个编号(名字什么的记不住啊):

编号 A  B  C

   ①  1  1  1

   ②  1  2  0

   ③  2  1  0

鉴于种类有点少,所以我们把这三种礼包组合成一些大礼包:

   ④  2  3  1或3  2  1 ①+②或①+③

   ⑤  5  5  2  ①②+①③

   ⑥  3  3  0  ②+③


我们一开始要尽量让A和B的数量平均一些,才能方便我们接下来的计算。


于是,我们一开始就不停的买④号礼包,直到不能买或者AB相等(注意这些都没有用循环,所以效率才是O(1))。

因为(制杖)店长要求相邻的礼包不能相同,所以我们要把每种小礼包礼包的数量尽可能平均。

所以接下来我们买⑤号礼包,直到不能买为止。

接下来继续买③号,也是买到不能买为止。


接下来,我们还剩下一些配件,我们就去买一开始的三种小礼包。

三种小礼包只要买一次,因为相邻礼包不能相等。


我们在计算的时候,就把总数累加,最后输出总数即可。


附一段购买④号礼包时的代码:

if a<>b then
begin
        k:=abs(a-b);
        x:=2;
        y:=2;
        if a>b then inc(x)
        else
        inc(y);
        j:=min(min(min(a div x,b div y),c),k);
       a:=a-j*x;
       b:=b-j*y;
       c:=c-j;
       ans:=ans+j*2;
end;


今天的比赛严重翻车。。。。下次脑洞别开太大。。。。

你可能感兴趣的:(普及组题解)