马丹。。。严重翻车。。。
第二题十分第三题爆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;
今天的比赛严重翻车。。。。下次脑洞别开太大。。。。