beautyofcomm

TopCoder SRM 526.5 DIV2 500

0
阅读(1660)

这篇文章提到了暴力

http://hi.baidu.com/wjbzbmr/blog/item/f3191c12f91b541f203f2eb0.html

考虑一个数x,它如果是完全平方数,那么它下一轮就跪了,否则它下一轮的位置是

x-sqrt(x),sqrt(x)取下整。

由于没删掉的数之间的顺序不会变。

我们显然是要找到一个最大的数,它在变成1之前没有跪,那么我们从n到1暴力判断。。。。

这个速度很慢。。Java会T。。改成C++就能卡过。。。

 

但自己当时找到了规律,可惜时间不够,没交上去,后来交上去了,规律如下:

首先看完全平方数的值
4:3
9:7
16:13
25:21
即x-sqrt(x)+1,
再看其它数
1 : 1
2 : 2
3 : 3
4 : 3
5 : 5
6 : 5
7 : 7
8 : 7
9 : 7
10 : 10
11 : 10
12 : 10
13 : 13
14 : 13
15 : 13
16 : 13
17 : 17
18 : 17
19 : 17
20 : 17
21 : 21
22 : 21
23 : 21
24 : 21
25 : 21
26 : 26
27 : 26
28 : 26
29 : 26
30 : 26
31 : 31
32 : 31
33 : 31
34 : 31
35 : 31
36 : 31
可以看到,每2个完全平方数之间的值只有2组,其分界点为他们的中点,
过程举例:x = 21 or 18

1.先判断是否为完全平方数,如果是,直接取x-sqrt(x)+1
2.如果不是,找到上一个和下一个完全平方数16和25,

3.判断x与16和25中点(20.5)的大小(注意:2个完全平方数的平均数一定是个小数,所以x要么大于,要么小于,不可能等于)

     21比中点大,直接取较大完全平方数25对应的值:21
     18比中点小,拿较小的完全平方数进行运算,16-(sqrt(16)-1)+sqrt(16) = 16 + 1 = 17;