好些日子没来论坛了.大家中秋节快乐!!!
版主大人的这个问题,我也用数学方法归纳了一下,下面是我的思路(没时间写代码):
我分析其中一组数据:
样例输入:
10
8 2
98 1
100 54
999 3
2 1
53 9
100 99
77 66
23 22
99 92
输出:
2673
考虑到 力气=Wi-Vi+Wj-Vj;并且合并i,j两堆书后W= Wi+Wj,V=Vi+Vj
我们可以用 book[i] = Wi-Vi;来保存数据,也不要分别保存W和V的值。
这样上面的数据就可以这样保存 book[10]={6,97,46,996,1,44,1,11,1,7};
下面来分析: 前面... a b c d e f ...A B C D E F ... 后面
这样,我们用两个变量,一个从前面开始,一个从后面开始,
1。当这两变量还未相遇时,
(1):前面开始的变量,如果有 a <= c,那么a和b是一定可以合并的;
(2):后面开始的变量,如果有 A >= C,那么C和B是一定可以合并的;
(+):由上面,我们可以把book数组变成了; (6+97)=103,46,996,1,44,1,11,8=(1+7),共用的力气是 103+8=111 【book=_103,46,996,1,44,1,11,8_】
(103+46),996,1,44,1,11,8 ,共用的力气是103+46=149 【book=_149,996,1,44,1,11_,8】
149,996,1,44,(1+11),8 .共用的力气是 1+11=12 【book=149,_996,1,44,12,8_】
149,996,1,44,(12+8) ,共用的力气是 12+8=20 【book=149,996,_1,44,20_】,这里不再满足这个条件了
2。当1。不再满足了,那么我们只要考虑这两个变量交界处的情况了,
149,996,(1+44),20 ,共用的力气是 1+44=45 【book=149,996,45,20】
3。2。的步骤以后,这时候就执行和1。相反步骤,变量向两边散开去,
149,996,(45+20) ,共用的力气是 45+20=65 【book=149,996,65】
148,(996+65) ,共用的力气是996+65=1061【book=149,1061】
4。重复1~3的步骤,最后当3中book只有2个数的时候,退出循环。
现在我们来计算总力气:【149+1061】+1061+65+45+20+12+149+111 = 2673
上面有些细节我没仔细考虑,我想按照这个思路是应该可以找到解决方法的。
还有就是,如果有 W的值比V的大的话,那解决起来更简单,连移动数组元素都不要。但好像楼主给出的测试数据中有些数据并不这样。
[ 本帖最后由 Windy0Winll 于 2010-9-22 17:24 编辑 ]
版主大人的这个问题,我也用数学方法归纳了一下,下面是我的思路(没时间写代码):
我分析其中一组数据:
样例输入:
10
8 2
98 1
100 54
999 3
2 1
53 9
100 99
77 66
23 22
99 92
输出:
2673
考虑到 力气=Wi-Vi+Wj-Vj;并且合并i,j两堆书后W= Wi+Wj,V=Vi+Vj
我们可以用 book[i] = Wi-Vi;来保存数据,也不要分别保存W和V的值。
这样上面的数据就可以这样保存 book[10]={6,97,46,996,1,44,1,11,1,7};
下面来分析: 前面... a b c d e f ...A B C D E F ... 后面
这样,我们用两个变量,一个从前面开始,一个从后面开始,
1。当这两变量还未相遇时,
(1):前面开始的变量,如果有 a <= c,那么a和b是一定可以合并的;
(2):后面开始的变量,如果有 A >= C,那么C和B是一定可以合并的;
(+):由上面,我们可以把book数组变成了; (6+97)=103,46,996,1,44,1,11,8=(1+7),共用的力气是 103+8=111 【book=_103,46,996,1,44,1,11,8_】
(103+46),996,1,44,1,11,8 ,共用的力气是103+46=149 【book=_149,996,1,44,1,11_,8】
149,996,1,44,(1+11),8 .共用的力气是 1+11=12 【book=149,_996,1,44,12,8_】
149,996,1,44,(12+8) ,共用的力气是 12+8=20 【book=149,996,_1,44,20_】,这里不再满足这个条件了
2。当1。不再满足了,那么我们只要考虑这两个变量交界处的情况了,
149,996,(1+44),20 ,共用的力气是 1+44=45 【book=149,996,45,20】
3。2。的步骤以后,这时候就执行和1。相反步骤,变量向两边散开去,
149,996,(45+20) ,共用的力气是 45+20=65 【book=149,996,65】
148,(996+65) ,共用的力气是996+65=1061【book=149,1061】
4。重复1~3的步骤,最后当3中book只有2个数的时候,退出循环。
现在我们来计算总力气:【149+1061】+1061+65+45+20+12+149+111 = 2673
上面有些细节我没仔细考虑,我想按照这个思路是应该可以找到解决方法的。
还有就是,如果有 W的值比V的大的话,那解决起来更简单,连移动数组元素都不要。但好像楼主给出的测试数据中有些数据并不这样。
[ 本帖最后由 Windy0Winll 于 2010-9-22 17:24 编辑 ]
悄悄地来。。。 然后悄悄地走。。。。。。