原题:http://codeforces.com/problemset/problem/30/C
题意:给出n个靶子的坐标(x, y),出现的时间t,以及击中靶子的概率p;
枪每秒移动一个单位的距离;
问击中靶子数的期望最大值;
思路:dp[i] 表示到i为止击中靶子数的期望最大值;
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
double dp[1100];
struct node
{
double x, y, t, p;
}w[2200];
bool cmp(node a, node b)
{
return a.t<b.t;
}
double dis(double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
double ans = 0;
for(int i = 1;i<=n;i++)
scanf("%lf%lf%lf%lf", &w[i].x, &w[i].y, &w[i].t, &w[i].p);
sort(w+1, w+1+n, cmp);
for(int i = 1;i<=n;i++)
{
dp[i] = w[i].p;
for(int j = 1;j<i;j++)
{
if(w[i].t-w[j].t>=dis(w[i].x, w[i].y, w[j].x, w[j].y))
dp[i] = max(dp[i], dp[j]+w[i].p);
}
ans = max(ans, dp[i]);
}
printf("%.10f\n", ans);
}
return 0;
}