http://www.1point3acres.com/bbs/thread-133039-1-1.html
Foobar里面的题,抽象出来如下
给一个长度为2-50的list,list里面每个element含有三个元素[a,b,c],每个element的下标为i。需要重新排序这个list使以下的多项式得数最小,如果有多重结果,按照字典顺序排序结果返回第一个
首先设 p = 1 - b/c
多项式为 a_0 + p_0*a_1 + p_0*p_1*a_2 + ... + p_0*...*p_{n-1}*a_n
a,b,c为小于1024正整数,b保证小于c
测试用例:
[[5,1,5],[10,1,2]]
输出 [1, 0], 多项式结果12.5
[[390, 185, 624], [686, 351, 947], [276, 1023, 1024], [199, 148, 250]]
输出 [2, 3, 0, 1] 多项式结果 276.54201990685095 (不是exactly精确因为是float)
已经试过了:
1)搜索剪支,穷举过程中当得数大于当前最大值时候放弃继续穷举 --- 超时
2)插入,每次取一个元素插入到排序好list L 里面,尝试所有可以插入的位置(len(L)+1)放在最好的地方 --- 通过部分test(未通过的不知道是什么。。。)
其实很简单啊。你用两个元素不同的排列得出的结果作个差。
greedy算法,排个序就做完了
Foobar里面的题,抽象出来如下
给一个长度为2-50的list,list里面每个element含有三个元素[a,b,c],每个element的下标为i。需要重新排序这个list使以下的多项式得数最小,如果有多重结果,按照字典顺序排序结果返回第一个
首先设 p = 1 - b/c
多项式为 a_0 + p_0*a_1 + p_0*p_1*a_2 + ... + p_0*...*p_{n-1}*a_n
a,b,c为小于1024正整数,b保证小于c
测试用例:
[[5,1,5],[10,1,2]]
输出 [1, 0], 多项式结果12.5
[[390, 185, 624], [686, 351, 947], [276, 1023, 1024], [199, 148, 250]]
输出 [2, 3, 0, 1] 多项式结果 276.54201990685095 (不是exactly精确因为是float)
已经试过了:
1)搜索剪支,穷举过程中当得数大于当前最大值时候放弃继续穷举 --- 超时
2)插入,每次取一个元素插入到排序好list L 里面,尝试所有可以插入的位置(len(L)+1)放在最好的地方 --- 通过部分test(未通过的不知道是什么。。。)
其实很简单啊。你用两个元素不同的排列得出的结果作个差。
greedy算法,排个序就做完了