2037: [Sdoi2008]Sue的小球
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 530 Solved: 282
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
-4 -2 2
22 30 26
1 9 8
Sample Output
數據範圍:
N < = 1000,對於100%的數據。 -10^4 < = xi,yi,vi < = 10^4
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#define FOR(i, x, y) for(int i=x;i<=y;i++)
#define LL long long
using namespace std;
const int MAXN = 1000 + 10;
struct Point
{
double x, y, v;
bool operator < (const Point& rhs)const
{
return x < rhs.x;
}
}p[MAXN];
int n;
double x0, dp[MAXN][MAXN][2], sum[MAXN];;
int main()
{
scanf("%d%lf", &n, &x0);
FOR(i, 1, n) scanf("%lf", &p[i].x);
FOR(i, 1, n) scanf("%lf", &p[i].y);
FOR(i, 1, n) scanf("%lf", &p[i].v);
sort(p + 1, p + 1 + n);
for(int i=1;i<=n;i++) sum[i] = sum[i-1] + p[i].v;
FOR(i, 1, n) dp[i][i][0] = dp[i][i][1] = p[i].y - sum[n] * abs(p[i].x - x0);
for(int len=2;len<=n;len++)
{
for(int i=1;i<=n-len+1;i++)
{
int j = i + len - 1;
dp[i][j][0] = max(dp[i+1][j][0] + p[i].y - abs(p[i].x - p[i+1].x) * (sum[i] + sum[n] - sum[j]),dp[i+1][j][1] + p[i].y - abs(p[i].x - p[j].x) * (sum[i] + sum[n] - sum[j]));
dp[i][j][1] = max(dp[i][j-1][0] + p[j].y - abs(p[j].x - p[i].x) * (sum[i-1] + sum[n] - sum[j-1]),dp[i][j-1][1] + p[j].y - abs(p[j].x - p[j-1].x) * (sum[i-1] + sum[n] - sum[j-1]));
}
}
printf("%.3lf\n", (1.0 * max(dp[1][n][0], dp[1][n][1]) )/ 1000.0);
return 0;
}