ABC E题求调(疑似精度问题)
查看原帖
ABC E题求调(疑似精度问题)
857626
_RainCappuccino_楼主2023/11/4 21:44
#include <bits/stdc++.h>
using namespace std;

const int M = 5010;
typedef double db;
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
#define endl '\n'
#define IOS (ios::sync_with_stdio(0), cin.tie(0), cout.tie(0))
int n;
int p[M];
db dp[M], dv[M];//dp[i]表示以 p[i] 开头的权值最大的序列的值
int f[M];//表示当 dp[i] 取得最大值时的长度
db ans = -INF;
db getval(int x){
    return dp[x] / dv[f[x]] - (1200 / sqrt(f[x]));
}
signed main(){
    cin >> n;
    for (int i = 1; i <= n; i++){
        double x = 1;
        for (int j = 1; j <= i; j++)
            dv[i] += x, x *= 0.9;
    }
    for (int i = 1; i <= n; i++)
        cin >> p[i], dp[i] = p[i], f[i] = 1;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j < i; j++){
            int res = dp[j] * 0.9 + p[i];
            int len = f[j] + 1;
            int cur = res / dv[len] - (1200 / sqrt(len));
            if (cur > getval(i))
                dp[i] = res, f[i] = len;
        }
        // cout << dp[i] << ' ' << f[i] << ' ' << getval(i) << endl;
        if (getval(i) > ans){
            ans = getval(i);
        }
    }
    printf("%.15f", ans);
    return 0;
}
2023/11/4 21:44
加载中...