zoukankan      html  css  js  c++  java
  • LG P4953 [USACO02FEB]Cow Cycling

    Description

    奶牛自行车队由$N$名队员组成,他们正准备参加一个比赛,这场比赛的路程共有$D$圈。 车队在比赛时会排成一条直线,由于存在空气阻力,当骑车速度达到每分钟$x$圈时,领头的 奶牛每分钟消耗的体力为$x^2$,其它奶牛每分钟消耗的体力为$x$。每头奶牛的初始体力值都是 相同的,记作$E$。如果有些奶牛在比赛过程中的体力不支,就会掉队,掉队的奶牛不能继续 参加比赛。每支队伍最后只要有一头奶牛能到终点就可以了。

    比赛规定,最小的计时单位是分钟,在每分钟开始的时候,车队要哪头奶牛负责领头, 领头奶牛不能在这分数中内掉队,每分钟骑过的圈数也必须是整数。

    请帮忙计划一下,采用什么样的策略才能让车队以最快的时间到达终点?

    Solution

    可以发现对于一个确定的方案,改变每头牛作为领队的顺序不会对答案产生影响,所以钦定每头牛按顺序作为领队,离开领队位置时就离开队伍

    设$dp_{i,j,k}$表示当前车队有$i$头牛,领队的体力为$j$,其余的体力为$k$

    $$dp_{i,j-l^2,k-l}=min(dp_{i,j,k}+1),j-l^2 geq 0$$

    $$dp_{i-1,k-l^2,k-l}=min(dp_{i,j,k}+1),k-l^2 geq 0$$

    分别对应换不换领队

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int n,e,d,dp[25][105][105],ans=1<<30;
    inline int read()
    {
        int f=1,w=0;
        char ch=0;
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')
                f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            w=(w<<1)+(w<<3)+ch-'0';
            ch=getchar();
        }
        return f*w;
    }
    int main()
    {
        n=read();
        e=read();
        d=read();
        memset(dp,127,sizeof(dp));
        dp[n][e][e]=0;
        for(int i=n;i>=1;i--)
        {
            for(int j=e;j>=0;j--)
            {
                for(int k=e;k>=0;k--)
                {
                    for(int l=1;l<=10&&j-l*l>=0&&l<=d;l++)
                    {
                        dp[i][j-l*l][k-l]=min(dp[i][j-l*l][k-l],dp[i][j][k]+1);
                    }
                    for(int l=1;l<=10&&k-l*l>=0&&l<=d;l++)
                    {
                        dp[i-1][k-l*l][k-l]=min(dp[i-1][k-l*l][k-l],dp[i][j][k]+1);
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=e;j++)
            {
                ans=min(ans,dp[i][j][e-d]);
            }
        }
        printf("%lld
    ",ans);
        return 0;
    }
    [USACO02FEB]Cow Cycling
  • 相关阅读:
    《Java基础学习笔记》JAVA修饰符之私有化(Private)
    《Java基础学习笔记》JAVA之静态代码块
    《Java基础学习笔记》JAVA之构造函数和构造代码块
    《Java基础学习笔记》JAVA面向对象
    在C#.NET中,如何生成PDF文件?主要有以下几个途径:(转)
    ckeditor与ckfinder的使用方法 .NET (转载)
    ckeditor3.3.1编辑区自动换行(转)
    iTextSharp 使用详解(转)
    .net DataGrid绑定列手动添加数据
    操作必须使用一个可更新的查询
  • 原文地址:https://www.cnblogs.com/JDFZ-ZZ/p/13733847.html
Copyright © 2011-2022 走看看