TopCoder SRM 526.5 DIV2 500
0赞这篇文章提到了暴力
http://hi.baidu.com/wjbzbmr/blog/item/f3191c12f91b541f203f2eb0
考虑一个数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要么大于,要么小于,不可能等于)
