3 花园改造 2
2.2 思路
要使快速排序达到最坏情况,只要让基准值是当前序列中最小的即可 (最大也可
以)。分析可以发现,这样只会扫描一遍,并把基准值与第一个数交换,T (N ) = T (N −
1) + Θ(N) = Θ(N
2
)。具体实现维护一个数组 B 记录原先的位置,每次只要在基准值填
上当前最小数,并交换 B[l] 和 B[F [l, r]]。
2.3 时间计算
这也是比较容易出错的部分,可以直接枚举,也可以推出公式
1
:
tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
(tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
其中tm_yday 表示从 1 月 1 日到该时刻经过的天数。
另一个问题是在 Windows 下,计算结果必须减掉 8*3600 秒,因为我们的时区为
UTC+8。这也是我强调 UTC 的原因。
2.4 使用日期函数计算
实际上,C 语言的time.h 中有一个mktime 函数可以直接完成转换。其原型如下:
time_t mktime( struct tm *time );
而上述公式中的值都是结构体tm 中的成员,另外还有tm_mon 和tm_mday,可以替
换tm_yday。但是请注意这些值的范围。
2
2.5 总结
本题是我的原创题,考察了对快速排序的理解,以及日期模拟。
3 花园改造
3.1 暴力
可以把当前 N 个花坛内的泥土状压或 hash,然后就转化为最多 C
N
个点的最短
路。(设 A
i
, B
i
≤ C)
1
参见http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_
16
2
参见http://en.cppreference.com/w/c/chrono/tm