NOIP2014题目简析:

chunlvxiong的博客


DAY1:

T1:生活大爆炸版石头剪刀布

  由于N≤200,所以直接模拟即可,多加手势什么的根本不是问题。

T2:联合权值

  先考虑如何求最大值,采取树形DP:

  用max[u][1]表示距离u点为1的点的最大权值(实际上还需要次大权值),用max[u][2]表示距离u点为2的点的最大权值,转移方程:

  max[u][1]=max{dis[u][v]|v是u的子节点}

  max[u][2]=max{max[v][1]|v是u的子节点}

  那么对于每个u来说,其最大贡献为max{max[u][1]*次大权值,max[u][2]*w[u]},然后对于每个u取个max就好了。

  再考虑如何求和:

  对于每个u来说,其任意两两子节点v都可以结合,但是如果两两计算速度太慢,考虑如下:

  2*(w[v1]*w[v2]+w[v1]*w[v3]+……+w[vn-1]*w[vn])

  =(w[v1]+w[v2]+……w[vn])*(w[v1]+w[v2]+……+w[vn])-w[v1]^2-w[v2]^2-……-w[vn]^2

  这样你只需要O(N)的时间复杂度就可以计算完成子节点结合的权值了,还需计算u和距离其2的节点的权值。

  仍然考虑树形DP,用sum[u][1]表示距离其u点为1的点的最大权值,用sum[u][2]表示距离u点为2的点的最大权值,转移方程:

  sum[u][1]=Σdis[u][v]|v是u的子节点

  sum[u][2]=Σsum[v][1]|v是u的子节点

  然后累加w[u]*sum[u][2]即可,总的时间复杂度为O(N)。

T3:飞扬的小鸟

  很容易想到DP,初步的DP如下:

  用dp[i][j]表示小鸟在i,j位置时最少点击屏幕的次数:

  dp[i][j]=min{dp[i-1][j+y[i]],dp[i-1][j-k*x[i]]+k}

  如果纯粹穷举i,j,k,时间复杂度为O(NM^2),会T掉。

  受无限背包问题启发,你允许同维转移,这样方程变成dp[i][j]=min{dp[i-1][j+y[i]],dp[i][j-x[i]]+1},然后要先转移j小的,再转移j大的。由于空间限制,还要开滚动数组来节省空间。另外注意:对于(i,j)为障碍物的点,要先转移完再令其强制为oo,而不是先令其强制为oo再转移。

  这样做时间复杂度O(NM),就可以A掉此题。

 

DAY2:

T1:无线网络发射器选址

  由于整个地图的最大范围为0..128,0..128。所以可以枚举每个位置,再枚举每个公共场所,看是否被覆盖,计算出其覆盖人数即可。

  时间复杂度O(128*128*N)。

T2:寻找道路

  题目给出了两个要求:

  1 、路径上的所有点的出边所指向的点都直接或间接与终点连通。

  2 、在满足条件1 的情况下使路径最短。

  你先要确定哪些点可以走到,以满足条件1。对于这个问题,你先建立反向边,然后从终点做一次BFS,得到哪些点可以到达终点。然后对于每个点的出边所指向的点,观察是否全部可以到达终点,如果是,表明这个点可以到达。

  然后直接跑spfa即可,对于那些不能到达的点不走即可。

T3:解方程

  首先,阿贝尔告诉我们,五次及以上的方程就没有求根公式了,所以只能考虑枚举。

  m的范围是≤100000,如果从1枚举到m,再使用高精度计算并判断是否为0,会大T特T。

  这时候要考虑取模了:

  如果f(x)=0,那么f(x) mod p必然也等于0。虽然这个结论反下并不成立,但是如果你多取几个质数p作为模数,那么f(x)=0的几率会变得很高。

  这样你就避免掉了高精度计算,由于每次计算f(x)的复杂度是O(N),所以总时间复杂度O(NM*质数的个数),仍然会T。

  这时候你要再卡掉些无用的计算:你会发现,f(x) mod p=f(x+k*p) mod p

  也就是说,如果一个f(x) mod p!=0的话,那么f(x+k*p) mod p也一定不等于,直接排除x+k*p这个解。

  这样一来,计算量会小很多,就可以A掉此题了。

posted @ 2017-08-18 15:20  chunlvxiong  阅读(155)  评论(1编辑  收藏  举报