8.12

来源:互联网 发布:怎样在淘宝上发布宝贝 编辑:程序博客网 时间:2024/06/08 02:07

今天做了NOI   P的题。。  结果挂得比做NOI的时候还惨,真的很不应该。

三道题都有一定的思维难度,但是写起来都比较简单。

我三道题一道做了1个小时,结果一道都没搞出来。。。。


第一题:题意:有N个区间,给出这N个区别的宽度和你在它之内的速度,问,从(0,0)走到(X,Y)(X为N个区别的宽度之和)所需要的最短时间,而且走到区间与区间的交界时必须在整点上。

一开始我去想DP,想了很久,最多觉得DP如果不是O(N)的就一定会超时,最后想到用单调队列优化DP,可是好像单调性有什么错误,60分只得了30分。正解是贪心,

你总共要使纵坐标增加Y,那么就需要考虑,在渡过哪一条河的时候向上走1的纵坐标使得时间的增量最小,用h[i]记录第i条河已经向上走了的纵坐标,那么再向上走1的时间增量就是(sqrt(w[i]*w[i]+(h[i]+1)*(h[i]+1))-sqrt(w[i]*w[i]+h[i]*h[i]))/v[i];用一个小根堆来维护每一条河的以及在河岸上的增量,每次选取最小的即可。



第二题之前做过类似的(oj3470)。如果时间再长一点应该能想出来。给出N*M的点,从一个点走到一个相邻的点消耗的体力是这两点高度差的平方。在一些点有可以回复体力的药,求从起点到终点消耗的最小体力值。

首先,如果没有点有药,那么直接做最短路即可。然后发现,只有最多15个点有药,算上起点和终点特殊点只有17个。把整段路分成17个阶段,经过不过含药的点直接用最短路处理,做17次单源最短路,求出从每个特殊到其他特殊点不回复体力所消耗的最小体力值。然后做一个状压DP。f[i][j]表示在i这个特殊点,状态为j的最小体耗。方程很显然。

f[k][j+1 shl(k-1)]=min(f[i][j]+dis[i][k]);'



第三题又是数学题。求1-n中质因子个数均为奇数且大小不超过m的数有多少个。

预处理出小于等于m的所有质数,然后做一个搜索,枚举每个质因子取多少次方。加个剪枝即可。

剪枝具体操作如下:用x记录当前选的数乘起来的值,如果x*当前质数的平方>n,那么它以及后面的质数最多只能取一次。



经验:对于每道题都要大致思考一下,不能一眼而过,然后按照从易到难的顺序深入思考。

0 0