|
|
从两个公式来看,要使得S20 - MAX_S15最小,就要在5000公式中尽量把大数往左边凑,因为左边的系数较大:
19*d10 + 17*d9 + 15*d8 + 13*d7 + 11*d6 + 9*d5 + 7*d4 + 5*d3 + 3*d2 + 1*d1 = 5000
算d10的上限:把d1~d9用常数1~17代入:
19*MAX_d10+81=5000
MAX_d10=258
而靠右边的几个数要尽量小。把d1~d7的最小值1~13用常数代入:
SELECT *
FROM (SELECT t.*
,5000-(5*(d10+d9+d8+d7+d6+d5+d4+d3)+3*d2+d1) max_s15
,RANK() OVER(ORDER BY 5000-(5*(d10+d9+d8+d7+d6+d5+d4+d3)+3*d2+d1) DESC) rnk
FROM (SELECT *
FROM (SELECT LEVEL d10 FROM DUAL WHERE LEVEL >= 19 CONNECT BY LEVEL<=258)
,(SELECT LEVEL d9 FROM DUAL WHERE LEVEL >= 17 CONNECT BY LEVEL<=258-2)
,(SELECT LEVEL d8 FROM DUAL WHERE LEVEL >= 15 CONNECT BY LEVEL<=258-4)
,(SELECT 13 d7
,11 d6
,9 d5
,7 d4
,5 d3
,3 d2
,1 d1
FROM DUAL
)
WHERE 19*d10 + 17*d9 + 15*d8 + 13*d7 + 11*d6 + 9*d5 + 7*d4 + 5*d3 + 3*d2 + 1*d1 = 5000
AND d10>d9+1
AND d9 >d8+1
AND d8 >d7+1
AND d7 >d6+1
AND d6 >d5+1
AND d5 >d4+1
AND d4 >d3+1
AND d3 >d2+1
AND d2 >d1+1
) t
)
WHERE rnk=1
;
D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 MAX_S15 RNK
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
205 25 15 13 11 9 7 5 3 1 3540 1
207 21 17 13 11 9 7 5 3 1 3540 1
206 23 16 13 11 9 7 5 3 1 3540 1
15个数的两两差距之和,最大可能是3540.
这是一种耍赖的办法,也没法保证正确性。
根据上述结论构造一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
27
206
验证:
WITH t AS (
SELECT 1 n FROM DUAL UNION ALL
SELECT 2 n FROM DUAL UNION ALL
SELECT 3 n FROM DUAL UNION ALL
SELECT 4 n FROM DUAL UNION ALL
SELECT 5 n FROM DUAL UNION ALL
SELECT 6 n FROM DUAL UNION ALL
SELECT 7 n FROM DUAL UNION ALL
SELECT 8 n FROM DUAL UNION ALL
SELECT 9 n FROM DUAL UNION ALL
SELECT 10 n FROM DUAL UNION ALL
SELECT 11 n FROM DUAL UNION ALL
SELECT 12 n FROM DUAL UNION ALL
SELECT 13 n FROM DUAL UNION ALL
SELECT 14 n FROM DUAL UNION ALL
SELECT 15 n FROM DUAL UNION ALL
SELECT 16 n FROM DUAL UNION ALL
SELECT 17 n FROM DUAL UNION ALL
SELECT 18 n FROM DUAL UNION ALL
SELECT 27 n FROM DUAL UNION ALL
SELECT 206 n FROM DUAL
)
SELECT SUM(t2.n-t1.n) sum
FROM t t1, t t2
WHERE t1.n<t2.n;
SUM
----------
5000
去掉8-13中的随便五个:
WITH t AS (
SELECT 1 n FROM DUAL UNION ALL
SELECT 2 n FROM DUAL UNION ALL
SELECT 3 n FROM DUAL UNION ALL
SELECT 4 n FROM DUAL UNION ALL
SELECT 5 n FROM DUAL UNION ALL
SELECT 6 n FROM DUAL UNION ALL
SELECT 7 n FROM DUAL UNION ALL
SELECT 13 n FROM DUAL UNION ALL
SELECT 14 n FROM DUAL UNION ALL
SELECT 15 n FROM DUAL UNION ALL
SELECT 16 n FROM DUAL UNION ALL
SELECT 17 n FROM DUAL UNION ALL
SELECT 18 n FROM DUAL UNION ALL
SELECT 27 n FROM DUAL UNION ALL
SELECT 206 n FROM DUAL
)
SELECT SUM(t2.n-t1.n) sum
FROM t t1, t t2
WHERE t1.n<t2.n;
SUM
----------
3540
[ 本帖最后由 newkid 于 2010-9-24 02:32 编辑 ] |
|