codeforces 30C
题意:
在
一
场
射
击
游
戏
中
,
有
n
个
点
,
第
i
个
点
的
坐
标
为
(
x
i
,
y
i
)
,
出
现
的
时
间
为
t
i
,
射
中
概
率
为
p
i
。
在一场射击游戏中,有n个点,第i个点的坐标为(x_i,y_i),出现的时间为t_i,射中概率为p_i。
在一场射击游戏中,有n个点,第i个点的坐标为(xi,yi),出现的时间为ti,射中概率为pi。
1
个
单
位
距
离
需
要
1
秒
时
间
瞄
准
,
问
射
中
点
的
个
数
的
最
大
期
望
。
1个单位距离需要1秒时间瞄准,问射中点的个数的最大期望。
1个单位距离需要1秒时间瞄准,问射中点的个数的最大期望。
题解:
d p [ i ] 表 示 最 后 一 个 射 中 的 是 第 i 个 点 的 最 大 期 望 。 dp[i]表示最后一个射中的是第i个点的最大期望。 dp[i]表示最后一个射中的是第i个点的最大期望。
- d p [ i ] = m a x ( d p [ i ] , d p [ j ] + p [ i ] . p ) dp[i] = max(dp[i], dp[j]+p[i].p) dp[i]=max(dp[i],dp[j]+p[i].p)
- a n s = m a x ( a n s , d p [ i ] ) ans=max(ans, dp[i]) ans=max(ans,dp[i])
#include <bits\stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1001;
double dp[N];
struct node{
ll x, y, t;
double p;
bool operator < (const node &b) const {
return t < b.t;
}
}p[N];
int main() {
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++){
cin >> p[i].x >> p[i].y >> p[i].t >> p[i].p;
}
sort(p+1, p+1+n);
for(int i = 1 ; i <= n ; i++){
dp[i] = p[i].p;
}
double ans = dp[1];
for(int i = 2 ; i <= n ; i++){
for(int j = i-1 ; j >= 1 ; j--){
ll dis = (p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);
ll able = (p[i].t-p[j].t)*(p[i].t-p[j].t);
if(able >= dis){
dp[i] = max(dp[i], dp[j]+p[i].p);
}
}
ans = max(ans, dp[i]);
}
cout << setiosflags(ios::fixed) << setprecision(9) << ans << endl;
return 0;
}