大家好,小金来为大家解答以上的问题。noip2010普及组,noip2010这个很多人还不知道,现在让我们一起来看看吧!
1、不好意思啦,你没说清楚是提高还是普及,然后我也有点急,就随便拉了个解题报告。
2、三、导弹拦截再次见到导弹拦截,颇感亲切,但是这次的导弹拦截,加入了立体环节,也从借用原题概念,让一个不存在的动态规划方法,影响解题思路。
3、其实,题目的核心解题思想还是贪心和枚举。
4、只不过要枚举的有些策略而已。
5、我也曾试过了,用单位长度去枚举两个点的半径,结果残酷的只过了两个点。
6、还是经过学生的解释,明白了排序后的贪心策略。
7、所以,向学生学习,也是老师的必修课程。
8、我再次强调,我经常向学生学习,教学相长,不外乎如此。
9、所以,希望更多的老师,能够时常放下自己的架子和身份,多多向学生请教,我们共同的成长。
10、按照到第一个点的距离平方排序之后,就可以不断让最远的点,不用离开第一点半径,进入第二点半径。
11、在这个过程中,第一点半径逐渐缩小,第二点半径,可能发生增大。
12、就需要一步步统计出,两个半径平方的最小值。
13、最终达到题目要求。
14、因为考虑到点的数量是100000,所以,无比需要使用快速排序。
15、题目如果想写的较为简洁,还是使用结构体比较方便。
16、首先定义一个结构体,包括x,y,jr1(距离第1点半径平方),jr2(距离第2点半径平方)。
17、struct dian{ int x; int y; int j1r; int j2r;}d[100050];这里面顺便定义了一个10万数量级的数组。
18、快速排序的函数:void qsort(int s, int e){ dian t; int l, r; if (s >= e) return ; l = s; r = e; t = d[s]; while (l < r) { while (l < r && d[r].j1r >= t.j1r) r--; d[l] = d[r]; while (l < r && d[l].j1r <= t.j1r) l++; d[r] = d[l]; } d[r] = t; qsort(s, r - 1); qsort(r + 1, e);}然后就是逐渐退出和更新半径的过程了:r = d[n].j1r; m2 = 0; for (i = n ; i >= 1 ; i--) { if (d[i].j2r > m2) m2 = d[i].j2r; tr = d[i - 1].j1r + m2; if ( r > tr ) r = tr; }最后r即为最小消耗。
19、以上是 王祺磊 的结题报告。
20、如您愿意给我(王祺磊)发邮件,欢迎发邮件至:fatship@163.com与我交流。
21、呵呵,又是老班啊!我是刘盛超,选我为答案吧。
22、发表下看法:我也是选的寄存器,似乎记得小学里的老师讲过的... ...这个貌似有点难。
本文到此分享完毕,希望对大家有所帮助。