zoukankan      html  css  js  c++  java
  • 1-10假期训练(hdu-2059 简单dp)

    题目一:传送门

    思路:水题,模拟即可

    题目二:传送门

    思路:dp,决策每个充电站是否要充电。(决策只有搜索,DP两种解决方法)

    (1)考虑状态的个数,n+2个,因为除了n个还有位置0,终点len两种状态;

    前一个状态可以推出后一个状态,所以可以得到循环的顺序外循环1--n,内循环i-1--0。

    (2)状态转移方程:dp[i]=MIN(dp[i],dp[i]+x,dp[i]+y),x表示要充电,y表示不要充电。

    (3)考虑x和y的求法:

    如果j==0,只考虑x即可,因为第一次肯定充满电

    如果j!=0,考虑x,y分为dis(i-j)>=c和dis(i-j)<c两种情况,分别计算就行(一开始就是这里被卡住了,

    如果dis(i-j)>c只要将它分为两部分考虑,分别计算v1的速度耗时和v2速度耗时即可)。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn = 120;
    double MIN(double a,double b)
    {
        return a<b?a:b;
    }
    double dp[maxn],l[maxn]; //记录每次的时间,为浮点型。 
    int main(void)
    {
        double x,y,timtu,num,num2;
        int len; //初始题中的变量均为整形,n个位置除外 
        int n,c,t;
        int v,v1,v2;
        int i,j; 
        while(~scanf("%d",&len))
        {
            scanf("%d%d%d",&n,&c,&t);
            scanf("%d%d%d",&v,&v1,&v2);
            for(i=1;i<=n;i++) scanf("%lf",&l[i]);
            l[0]=0;l[n+1]=len;
            for(i=1;i<maxn;i++) dp[i]=INT_MAX;dp[0]=0; //初始化处理dp,比较min,所以初始化最大 
            timtu=len*1.0/v;
            for(i=1;i<=n+1;i++)
            {
                for(j=i-1;j>=0;j--)
                {
                    if(j==0) //特殊情况 
                    {
                        num=l[i]-l[0];
                        if(num<=c) dp[i]=MIN(dp[i],dp[0]+1.0*num/v1);
                        else
                        {
                            num2=1.0*c/v1;
                            num-=c;
                            num2+=1.0*num/v2;
                            dp[i]=MIN(dp[i],dp[0]+num2);
                        }
                    }
                    else
                    {
                        x=t;num=l[i]-l[j];y=1.0*num/v2; //x表示需要充电,y表示不用充电。 
                        if(num<=c) x+=num*1.0/v1;
                        else
                        {
                            x+=c*1.0/v1;
                            num-=c;
                            x+=num*1.0/v2;
                        }
                        dp[i]=MIN(dp[i],dp[j]+MIN(x,y));
                    }
                }
            }
            if(dp[n+1]>=timtu) printf("Good job,rabbit!
    ");
            else printf("What a pity rabbit!
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    sql sever 数据字典语法
    端口使用情况
    koa中间件说明
    FLIP动画思想
    跨域下载文件显示文件名
    post方法打开新页面并提交参数
    常用快捷键
    cnpm与npm安装的包不一样
    chrome devTools变量不提示,断点点击去不掉问题
    未修改的模块失效排查方法
  • 原文地址:https://www.cnblogs.com/2018zxy/p/10249335.html
Copyright © 2011-2022 走看看