用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

旅行规划问题

2012-09-20 作者: 神马举报

[c++]代码库

G 先生想独自驾驶汽车从城市A 到城市B。从城市A 到城市B 的距离为d0 公里。汽车油箱的容量为c 公升。每公升汽油能行驶e 公里。出发点每公升汽油的价格为p 元。从城市A到城市B 沿途有n 个加油站。第i 个加油站距出发点的距离为di,油价为每公升pi元。如何规划才能使旅行的费用最省。

编程任务:

对于给定的d0,c,e,p,和n 以及n个加油站的距离和油价di 和pi,编程计算最小的旅行费用。如果无法到达目的地,输出“No Solution”。

Input
每组测试数据的第1 行是d0,c,e,p,和n。接下来的n 行中每行2个数di 和pi。

Output
输出最小的旅行费用,精确到小数点后2 位。每个答案1行。

Sample Input
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
Sample Output
26.95

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std ;
double f[10005][2];
double ff[10005][2];
bool run()
{
    double d,c,e,p;
    int n,k;
    if ( ! ( cin>>d>>c>>e>>p>>n ) ) return false;
    int i,j;
    ff[0][0]=0;
    ff[0][1]=p;
    for ( i=1; i<=n; i++ )
    {
        cin>>ff[i][0]>>ff[i][1];
    }
    ff[n+1][0]=d;
    ff[n+1][1]=0;
    n++;
    fill ( &f[0][0],&f[10003][1],0 );
    double t,x;
    double y,a[2],b,q;
    for ( i=1; i<=n; i++ )
    {
        for ( j=0; j<i; j++ )
        {
            t=ff[i][0]-ff[j][0];
            x=f[j][0]*e;
            if ( x>=t )
            {
                y= ( double ) t/e;
                a[0]=f[j][0]-y;
                a[1]=f[j][1];
                q=f[j][0];
            }
            else
            {
                y= ( double ) ( ( t-x ) /e );
                if ( y+f[j][0]>c ) continue;
                a[0]=0;
                a[1]=f[j][1]+y*ff[j][1];
                q=f[j][0]+y;
            }
            if ( ff[j][1]<ff[i][1] )
            {
                b= ( d-ff[j][0] ) /e;
                if ( ( c-q ) <b ) b=c-q;
                for ( k=i+1; k<=n; k++ )
                {
                    if ( ( ff[i][0]+b*e ) >=ff[k][0] )
                    {
                        if ( ff[k][1]<ff[j][1] )
                        {
                            b= ( ff[k][0]-ff[i][0] ) /e;
                            break;
                        }
                    }
                    else
                        break;
                }
                a[1]+=b*ff[j][1];
                a[0]+=b;
            }
            if ( a[0]==f[i][0]||f[i][1]==0 )
            {
                if ( a[1]<f[i][1]||f[i][1]==0 )
                {
                    f[i][0]=a[0];
                    f[i][1]=a[1];
                }
            }
            else if ( a[0]>f[i][0] )
            {
                if ( a[1]< ( a[0]-f[i][0] ) *ff[i][1]+f[i][1] )
                {
                    f[i][0]=a[0];
                    f[i][1]=a[1];
                }
            }
            else if ( a[0]<f[i][0] )
            {
                if ( a[1]+ ( f[1][0]-a[0] ) *ff[i][1]<f[i][1] )
                {
                    f[i][0]=a[0];
                    f[i][1]=a[1];
                }
            }
        }
    }
 
    if ( f[n][1]==0 )
    {
        cout<<"No Solution\n";
    }
    else
        printf ( "%.2lf\n",f[n][1] );
    return true;
}
int main()
{
 
    while ( run() );
    return 0;
}




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...