题目描述
实数
x
1
,
x
2
,
.
.
.
,
x
m
x_1,x_2,...,x_m
x 1 , x 2 , . . . , x m 满足:
{
−
1
a
≤
x
i
≤
a
x
1
+
x
2
+
.
.
.
+
x
m
=
b
a
\begin{cases}-\dfrac1{\sqrt a}\le x_i\le \sqrt {a}\\ x_1+x_2+...+x_m=b\sqrt a\end{cases}
⎩ ⎪ ⎨ ⎪ ⎧ − a
1 ≤ x i ≤ a
x 1 + x 2 + . . . + x m = b a
最大化目标函数
F
(
x
1
,
x
2
,
.
.
.
,
x
m
)
=
x
1
p
+
x
2
p
+
.
.
.
+
x
m
p
F(x_1,x_2,...,x_m)=x_1^p+x_2^p+...+x_m^p
F ( x 1 , x 2 , . . . , x m ) = x 1 p + x 2 p + . . . + x m p
其中
m
,
p
,
a
,
b
∈
Z
m,p,a,b\in\mathbb Z
m , p , a , b ∈ Z ,且
a
>
0
a>0
a > 0 ,
p
p
p 为正的偶数。
输入格式
输入由多组数据构成,每行一组数据,包含
4
4
4 个整数
m
,
p
,
a
,
b
m,p,a,b
m , p , a , b 。数据保证
a
>
0
a>0
a > 0 、
p
p
p 为偶数,且存在一组实数
x
1
,
x
2
,
.
.
.
,
x
m
x_1,x_2,...,x_m
x 1 , x 2 , . . . , x m 满足题设条件。
输出格式
对于每组数据,输出一行一个整数,代表该组数据下目标函数
F
(
x
1
,
x
2
,
.
.
.
,
x
m
)
F(x_1,x_2,...,x_m)
F ( x 1 , x 2 , . . . , x m ) 的最大值(四舍五入至最近的整数)。
数据范围
对于每组数据,
m
≤
2000
m\le 2000
m ≤ 2 0 0 0 ,
p
≤
12
p\le 12
p ≤ 1 2 。
输入样例
1997 12 3 - 318
10 2 4 - 1
输出样例
189548
6
题目分析
该问题属于带约束的优化问题,约束条件为线性约束,目标函数为非线性函数。根据目标函数的凸性,考虑采用调整法/凸优化的方法:
固定
x
1
,
x
2
,
.
.
.
,
x
m
−
2
x_1,x_2,...,x_{m-2}
x 1 , x 2 , . . . , x m − 2 ,设
x
m
−
1
+
x
m
=
d
x_{m-1}+x_m=d
x m − 1 + x m = d ,则
F
(
x
1
,
x
2
,
.
.
.
,
x
m
)
=
x
1
p
+
x
2
p
+
.
.
.
+
x
m
−
2
p
+
(
d
−
x
m
)
p
+
x
m
p
≜
F
(
x
m
)
F(x_1,x_2,...,x_m)=x_1^p+x_2^p+...+x_{m-2}^p+(d-x_m)^p+x_m^p\triangleq F(x_m)
F ( x 1 , x 2 , . . . , x m ) = x 1 p + x 2 p + . . . + x m − 2 p + ( d − x m ) p + x m p ≜ F ( x m )
则
F
′
(
x
m
)
=
p
x
m
p
−
1
−
p
(
d
−
x
m
)
p
−
1
F'(x_m)=px_m^{p-1}-p(d-x_m)^{p-1}
F ′ ( x m ) = p x m p − 1 − p ( d − x m ) p − 1
且
F
′
′
(
x
m
)
=
p
(
p
−
1
)
x
m
p
−
2
+
p
(
d
−
x
m
)
p
−
2
≥
0
F''(x_m)=p(p-1)x_m^{p-2}+p(d-x_m)^{p-2}\geq 0
F ′ ′ ( x m ) = p ( p − 1 ) x m p − 2 + p ( d − x m ) p − 2 ≥ 0
易见
F
′
(
x
m
)
F'(x_m)
F ′ ( x m ) 的唯一零点为
d
2
\dfrac d2
2 d ,因此
F
(
x
m
)
F(x_m)
F ( x m ) 在其定义域的边界上取得最值。
下证:当目标函数
F
(
x
1
,
x
2
,
.
.
.
,
x
m
)
F(x_1,x_2,...,x_m)
F ( x 1 , x 2 , . . . , x m ) 取最大值时,至多有一个
x
i
∉
{
−
1
a
,
a
}
x_i\notin\{-\frac1{\sqrt a},\sqrt a\}
x i ∈ / { − a
1 , a
} 。
当
m
=
1
m=1
m = 1 时,命题平凡。
当
m
≥
2
m\ge 2
m ≥ 2 时,假设有不少于2个
x
i
∉
{
−
1
a
,
a
}
x_i\notin\{-\frac1{\sqrt a},\sqrt a\}
x i ∈ / { − a
1 , a
} ,不妨设
x
i
,
x
j
∉
{
−
1
a
,
a
}
x_i,x_j\notin\{-\frac1{\sqrt a},\sqrt a\}
x i , x j ∈ / { − a
1 , a
} ,则保持
x
i
+
x
j
x_i+x_j
x i + x j 不变的前提下将
x
i
x_i
x i 或
x
j
x_j
x j 调整至边界时
F
F
F 更大,此时必有
x
i
′
x_i'
x i ′ 或
x
j
′
∈
{
−
1
a
,
a
}
x_j'\in\{-\frac1{\sqrt a},\sqrt a\}
x j ′ ∈ { − a
1 , a
} 。
因此,可以枚举
x
1
,
x
2
,
.
.
.
,
x
m
x_1,x_2,...,x_m
x 1 , x 2 , . . . , x m 中
a
\sqrt a
a
的数量:设
x
1
=
x
2
=
.
.
.
=
x
k
=
a
x_1=x_2=...=x_k=\sqrt a
x 1 = x 2 = . . . = x k = a
,
x
k
+
1
=
.
.
.
=
x
m
−
1
=
−
1
a
x_{k+1}=...=x_{m-1}=-\dfrac1{\sqrt a}
x k + 1 = . . . = x m − 1 = − a
1 ,则
x
m
=
b
a
−
k
a
+
(
m
−
k
−
1
)
⋅
1
a
x_m=b\sqrt a-k\sqrt a+(m-k-1)\cdot\dfrac1{\sqrt a}
x m = b a
− k a
+ ( m − k − 1 ) ⋅ a
1 。若
x
m
∈
[
−
1
a
,
a
]
x_m\in[-\dfrac1{\sqrt a},\sqrt a]
x m ∈ [ − a
1 , a
] ,则计算当前的
F
(
x
1
,
x
2
,
.
.
.
,
x
m
)
F(x_1,x_2,...,x_m)
F ( x 1 , x 2 , . . . , x m ) ,对所有
k
k
k 取最大值即得
F
(
x
1
,
x
2
,
.
.
.
,
x
m
)
F(x_1,x_2,...,x_m)
F ( x 1 , x 2 , . . . , x m ) 的全局最大值。
参考代码
#include < iostream>
#include < cmath>
using namespace std;
int main ( ) {
int m, p, a, b;
double maxf = - 1 , f, bound;
while ( ~ scanf ( "%d %d %d %d" , & m, & p, & a, & b) ) {
maxf = 0 ;
bound = sqrt ( ( double) a) ;
for ( int i = 0 ; i < m; i++ ) {
double x = b * bound - i * bound - ( m - i - 1 ) * ( - 1 / bound) ;
if ( x <= bound && x >= - 1 / bound) {
f = i * pow ( bound, p) + ( m - i - 1 ) * pow ( 1 / bound, p) + pow ( x, p) ;
if ( f > maxf) maxf = f;
}
}
printf ( "%.0f\n" , maxf) ;
}
return 0 ;
}
评论(0)