来源: http://hihocoder.com/problemset/problem/1358
关键思路:
每次选取使得(1+1/x)^a 最大的第x类属性, 提高该属性可使目标函数在当前的基准下增大的最快。感觉与梯度下降法有些相似之处,在目标函数为凸函数时这种方式求得的局部最优解也是全局最优的。
另外需要注意大数输出时的精度问题
具体实现:
#include #include #include using namespace std; #define SIZE 10 #define eps 1e-6 int N, K, a[SIZE], b[SIZE]; void init() { cin >> N >> K; for (int i = 0; i < K; ++i) cin >> a[i]; for (int i = 0; i < K; ++i) cin >> b[i]; } void solve() { double mx, tmp; int idx; for (int i = 0; i < N; ++i) { mx = 0; idx = -1; for (int j = 0; j < K; ++j) { tmp = pow(1 + 1.0 / a[j], 1.0 / b[j]); if (tmp - mx > eps) { mx = tmp; idx = j; } } ++a[idx]; } long double ans = 1.0; for (int i = 0; i < K; ++i) ans *= pow(a[i], 1.0 / b[i]); cout << fixed << setprecision(4) << ans << endl; } int main() { init(); solve(); return 0; }