NOIP2014提高组模拟题 8.9

一、最大配对

题意:给两个序列,要求选k组,每组从两个序列中各选一个数,要使各组数的差的和最大。

小论:两个序列分别排序。每次用一个序列的最大的减另一个序列的最小的。

当时情况:估计100分,结果50分。虽然题目有提醒答案可能超过2^31-1,我也看到了,但想着等下打完再改,于是我打着打着就忘了……最后挂了50分。实在不应该。这个惨痛的教训告诉我们:以后码代码时,发现错漏要及时改正,或加个注释提醒自己,以防悲剧的发生。好,就此打住。

 

二、旅行

题意:一组数a[1]..a[n]。可任意次交换相邻的两个数,但每次交换的较前的数,必须在前一次交换的较前的数的后面。要使最后交换后的序列每两个相邻的数的差的总和最小。

小论:DP(这题描述神似以前的某题,但方法迥乎不同。)我们可以发现,将第 i 个数一直换到第 j 个数,交换后的第i , i+1 , i+2 , ... , j-1与交换前的第i+1, i+2 , ... ,j 分别对应相同。也就是说,将第 i 个数换到第 j 个数,第 i ~ j-1个数间的相对位置没发生变化,即这一段里每两个相邻的数的差的总和不变 。于是我们可用s [ i ] 记录【到第 i 个数不进行任何交换的答案】,也就是前 i 个数每相邻两数的差的总和。设f [ i , 0 ]为 第 i 个数到第n个数,第  i 个数不交换的最优解;f [ i , 1 ]为第 i 个数到第n个数, 第 i 个数交换的最优解。从n-1倒推到1。有f [ i , 0 ]=max(   f [ i +1,0]+| a [ i ]- a [ i+1] | , f [ i+1 ,1 ]+ | a [ i ]- a [ i+2 ] |  );(因为如果i+1 个数交换的话,第i+1个数会变成原来的第 i+2 个数)。

对于f [ i ,1 ],我们枚举它交换到的位置  j ,用min( f [ j+1 ,0]+| a[ i ]-a[ j] |  + | a[ i ]-a[ j+1 ] | + s[ j ]- s[ i+1 ], f[ j+1 ,1]+ | a[ i ]- a[ j] | +  | a[ i ]-a[ j+2 ] |+s[ j ]-s[ i+1 ]) 来更新f [i , 1]。

注意方面:临界位置的处理。对于j=n 和j=n-1 的情况,明显不用加上a[ i ]和a[ j+1 ]那坨玩意的比较了。

当时情况:估计20分,实际20分。之前打出了个dp,最后1小时又想了想发现之前的想法是错的。最后只能交了个暴力上去。

 

三、资源勘探

题意:给出一个n*m 的矩阵,B[i, j]表示仅包含前i行与前j列的子矩阵有多少个数字恰好出现一次,那么你所要输出所有B[i, j]之和mod 19900907

小论:设f[i,1]为数i横坐标的最小值,f[i,2]为数i横最标的次小值(一开始都是m+1)f[i,3]为数i最近出现的行数。从(11)扫到(nm)。在第j行扫到一个数i,在答案中增加(f[i,2]-f[i,1])*(j-f[i,3])(因为在纵坐标为f[i,3]~j-1,横坐标从f[i,1]~f[i,2]-1的矩阵中,第i个数都只出现过一次),并更新f[i]。最后扫一遍每个数更新答案(因为最后一次更新的还没算)。

当时情况:估计30分,实际20分。以为又是dp,想了半天没想出来,浪费了大量时间,仍然只能上交暴力。

 

四、排列统计

题意:对于给定的一个长度为n的序列{B[n]},问有多少个序列{A[n]}对于所有的i满足:A[1]A[i]i个数字中有恰好B[i]个数字小等于i。其中{A[n]}1n的一个排列,即1nn个数字在序列A[I]中恰好出现一次。 (原谅我语文不好不知如何描述于是把题目描述搬运了过来。)

小论:       用一个矩阵表示一个序列A

比如

0 0 1 0 0

0 1 0 0 0

0 0 0 0 1

1 0 0 0 0

0 0 0 1 0

表示 32514

B[i]即表示以(1,1)为左上角,(i,i)为右下角的矩阵中1的个数。可以发现原来那个大矩阵是由n-1个反的’L’形与(1,1)组成的。对于B[i]-B[i-1],

如果它为1:则可以在第i-1’L’形的格子中选一个填1。由于大矩阵每行每列最多只有11,所以这个’L’形中可以选(i*2–1–b[i-1])个格子填1

如果它为2:则可以在第i-1’L’形的格子中选两个填2。而不可能在第(i , i )上填1(如果填了,剩下一个1无论填在哪都会与其在同一行或同一列)。所以方案数为(i – 1– b[i-1]^2

如果它为0:不管它。

如果它大于2:不可能。

最后把方案乘起来就行。由于答案很大,所以需使用高精度。

当时情况:估计30分,实际30分。第三题浪费了大量时间,使这题基本上没多少时间思考,直接打了暴力。

 

总结:这套模拟题充分暴露了自己的问题:贪快贪多。第一题打完后没好好检查就不管了,想着要赶紧打完后面的题,多拿些分。可后面的题却怎么也想不到正解,对着题目干瞪眼半天,最后也只能交个暴力上去,而第一题本能AC,反而因为自己的疏漏跪了。今后做题要改变策略,先把会做的、胸有成竹的题100%拿下,不留缺漏。对于暂时想不出正解的题,换个思路(就算挂也不要吊死在一棵树上),或者暂时放一放,做做后面的题。这样方能发挥出自己的正常水平,不留遗憾。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值