ACdream1092

题意是给出某个地鼠的出现位置以及出现时间,人有一个移动速度,求此人最多可以打多少个地鼠?

我们根据时间把所有的地鼠排序,如果两个地鼠之间的距离不超过时间只差与速度的乘积,那说明打完上一只地鼠还可以打到这一只地鼠。

直接f[i]表示打完第i只地鼠且此时在i地鼠位置的期望,DP即可。

召唤代码君:

/*
* this code is made by 092000
* Problem: 1092
* Verdict: Accepted
* Submission Date: 2014-07-19 23:27:11
* Time: 276MS
* Memory: 1732KB
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 1010
using namespace std;

struct mouse{
    double x,y,t,p;
}m[maxn];

bool cmp(mouse m1,mouse m2)
{
    return m1.t<m2.t;
}

int T,n,v;
double ans,sum[maxn];

double dis(int i,int j)
{
    return sqrt((m[i].x-m[j].x)*(m[i].x-m[j].x)+(m[i].y-m[j].y)*(m[i].y-m[j].y));
}

int main()
{
    sum[0]=m[0].x=m[0].y=m[0].t=0;
    scanf("%d",&T);
    while (T--)
    {
        ans=0;
        scanf("%d%d",&n,&v);
        for (int i=1; i<=n; i++)
            scanf("%lf%lf%lf%lf",&m[i].x,&m[i].y,&m[i].t,&m[i].p),sum[i]=0;
        sort(m+1,m+1+n,cmp);
        for (int i=1; i<=n; i++)
        {
            for (int j=0; j<i; j++)
                if (dis(i,j)<=(m[i].t-m[j].t)*v) sum[i]=max(sum[i],sum[j]);
            ans=max(ans,sum[i]=sum[i]+m[i].p);
        }
        printf("%.6f\n",ans);
    }
    return 0;
}

ACdream1092

时间: 2024-11-29 08:06:21

ACdream1092的相关文章