hdu 4563

hdu 4563

  • 把每个命令走的距离抽象成完全背包
  • 枚举最后一个不是整点走完的命令
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#include <set>
#include <queue>

using namespace std;

typedef long long LL;
const double N = -1e9;

double DP[105];
int xx[105],yy[105];

double cal(double t,int v)
{
    return -9.8*t*t/2.0+v*t;
}

double check(int x,int n,int L)
{
    for(int i = 0; i <= 100; i++)
        DP[i] = N;
    DP[0] = 0;
    for(int i = 0; i < n; i++) //选第几个命令
    {
        if(i == x) continue;
        for(int j = L; j >= 0; j--) //到距离j
        {
            for(int k = 0; k <= L/xx[i]; k++) //命令i走k秒
            {
                if(j >= k*xx[i])
                {
                    DP[j] = max(DP[j],DP[j-k*xx[i]]+cal(k,yy[i]));
                }
            }
        }
    }
    double ans = N;
    for(int i = 0; i <= L; i++)
    {
        ans = max(ans,DP[i]+cal(1.0*(L-i)/xx[x],yy[x])); //枚举最后一个命令是从哪个
    }
    return ans;
}


void solve(int cnt)
{
    int nn,L;

    scanf("%d %d",&nn,&L);
    for(int i = 0; i < nn; i++)
    {
        scanf("%d %d",&xx[i],&yy[i]);
    }
    double ans = N;
    for(int i = 0; i < nn; i++)
    {
        ans = max(ans,check(i,nn,L)); //枚举最后一个命令是哪个,因为只有最后一个命令不是整点到达
    }
    printf("Case %d: %.3f\n",cnt,ans);
}

int main(void)
{
    int t,cnt = 1;
    scanf("%d",&t);
    while(t--)
    solve(cnt++);
    return 0;
}

posted on 2017-04-11 09:09  鱼泪儿  阅读(165)  评论(0编辑  收藏  举报

导航