NOIP-2016-普及-题解

来源:互联网 发布:ci框架数据库授权 编辑:程序博客网 时间:2024/05/25 19:59

Word文档好看一些

NOIP-2016-普及-题解

                   By 冯英杰

1 Pencil

1.1  算法一

题目要求只能买一种包装的铅笔。可以发现,题目有整数倍的子任务,我们只需要看看3种包装每种最多要买多少袋同样包装的铅笔,再乘上它对应的价钱,取3者最小值即可

期望得分:50

1.2  算法二

针对于一算法。例:一包装每袋有2支铅笔,一袋3元,老师共需要3只铅笔.按照一方法做是不行的,因为买完后,还是有3 mod 2=1支铅笔,所以我们还要买多一个包装的。除此之外,其余同上。

期望得分:100

2 Date

2.1  算法一

子任务中说date1=date2,所以我们直接判断题目输入的字符串是否构成回文,输出即可。

时间复杂度O(8)  期望得分:60

2.2  算法二

可以在题目两个日期之间date1~date2一天一天判断当天的日期是否构成回文,用字符串处理会超时,用算术法应能卡过去。

时间复杂度O(8999*12*31) 如果是算术法的话

期望得分:80~100

2.3  算法三

   因为年份是四位数,那么组成回文数时,回文数的左边一定是这个年份,枚举年份即可。根据回文数的左边,我们就可以推出右边的月和日。只需要判断月和日合不合法。

   1、日是否超过当前这个月的天数。

   2、月份只在1~12间,

   3、闰年的情况

   4、且当前日期是否在date1~date2之间。

   时间复杂度O(8999*4)  期望得分:100

3 Port

3.1  算法一

   把第i时刻出现的第j艘船以b[i,j]的形式存起来,按照题目一次次累加即可。累加可以使用计数数组优化。B数组空间会爆。

时间复杂度O(∑ki*n)  期望得分:60

3.2  算法二

   若以b数组的形式存,很多地方都是空的,∑ki≤300000。于是我们可以用队列来存每个人的国籍及其那个人上船的时间。用k来维护他有多少个人。用head来维护第head~k的人是在k时间前24小时上岸的,维护方法即去掉不是在当前时刻前24小时的船,同时删除他的国籍所拥有的人数,头指针指向下一个。同样用ans[x]表示x国籍有多少个人。若原有,删后无则减少ans,若原无,加后有,则累加ans。

时间复杂度O(∑ki+n) 期望得分:100

4 Magic

4.1  算法一

枚举四个数,符合条件累加方案数。

时间复杂度O(n^4或m^4) 期望得分:35~45

4.2  算法二

四个数是可以根据xb-xa=2(xd-xc)推出来的,所以减少一重循环。

时间复杂度(n^3或m^3) 期望得分:50~75

4.2  算法二

其实我们可以根据题目的三个条件画出一个数轴

A<B<C<D

(B-A)=2(D-C)

3(B-A)<(C-B)

根据①条件:

 

根据②条件,我们可以得出,AB的距离是CD距离的两倍,设CD距离为i:

 

根据③条件,我们可以得出CB的距离大于AB的三倍,就是>2i*3=6i

 

我们可以枚举i,再枚举A的位置,枚举C的位置,再判断一下是否出现过ABCD,累加方案即可(Wx=Wy*Wz*Wa)另外三个出现次数。

时间复杂度O(**)   期望得分:80~85

4.3  算法三

这个是针对80分算法一个改进。

我们尝试一下把三重变成两重,把枚举A,C的位置分开起来做。

如上,我们得知,枚举了i,知A即知B,知C即知D。

A的方案数是:B和CD出现的次数相乘

B的方案数是:A和CD出现的次数相乘

C的方案数是:D和AB出现的次数相乘

D的方案数是:C和AB出现的次数相乘。

A来讲,B出现的次数可以直接通过A+i求出来。B的出现次数同。可是有个难搞的CD,我们可不可以考虑用一种优的方案来考虑?我们先看个图:

 

根据这个,我们发现,C能在的位置是根据i而固定的。那么我们可以使用后缀和来实现这一想法。C=n-i~8*i+1

后缀和:从这个范围内的全部CD对的个数。

根据这个,我们枚举A的位置。

那么a的出现次数为:bz[j+2*i](b的出现次数)*w[j+8*i+1](CD对)

B同。

 

同理,枚举C的位置,前缀和也是这么求的,大家自己想想。

最后输出对应的次数即可。

时间复杂度O(n)  期望得分:95~100

 

后记:第一次写题解,若有错误,望指出其错误,谢谢。

 

 

 

 

 

 

 

 

 

 

 

1 0
原创粉丝点击