码迷,mamicode.com
首页 > 其他好文 > 详细

Codevs 1046 旅行家的预算 贪心

时间:2017-12-01 23:40:50      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:需要   出发点   ace   加油站   min   贪心   input   div   std   

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio> 
#include <queue>
using namespace std;

const int maxn = 100 + 30;
const int INF = 999999999;
double D1;          //两地之间距离 D1 
double C,           //汽车容量  C 
       D2;          //每升汽油能行驶的距离 D2 
double P;           //出发点汽油价格 

double D[maxn];     //经过的加油站到起点的距离
double Px[maxn];    //经过的加油站的费用 

double ans;         //最后的价格
int N;              //沿途加油站个数

double rest[maxn];  //剩余

void solve();
void input();

//输入数据
void input()
{
    cin >> D1 >> C >> D2 >> P >> N;
    for (int i = 1; i <= N; i++)
    {
        cin >> D[i] >> Px[i];
        rest[i] = C;          
    }
}
 
void solve()
{
    
    //输入数据
    input(); 
        
    //一开始肯定要加汽油
    D[N + 1] = D1;            // 为了写起来方便,将终点也认为是加油站, 离起点 D1距离
    Px[N + 1] = INF;          // 终点了嘛,所以需要价格 0
    Px[0] = P;                //起点处的 价格 
    rest[0] = C;              //起点设置为 C 
     
    int minx = 0;             // minx: 当前价格最低的汽油站 
    
    for (int i = 1; i <= N+1; i++)
    {
        //接下来要前进的距离
        double need = (D[i] - D[i - 1]) / D2;     //接下来要前进的距离所需要的汽油量
        
        if (need > C) {                          //所需要的汽油量  大于  最大的容量,显然应该No Solution了 
            cout << "No Solution\n";
            return;
        }
        
        //总是选择当前价格最小的加油站 
        if (Px[minx] <= Px[i - 1])
        {
            if (need <= rest[minx]) {
                rest[minx] -= need;
                ans += need * Px[minx];
            }
            else {
                need -= rest[minx];
                ans += rest[minx] * Px[minx];
                minx = i - 1;                  //因为need > 当前最小价格的加油站,所以还需要加上前一个的加油站汽油 
                rest[minx] -= need;
                ans += need * Px[minx];
            }
        }
        else 
        {
            minx = i - 1;
            rest[minx] -= need;
            ans += need * Px[minx];
        }
            
    }
    
    printf("%.2lf\n", ans);
}

int main()
{
    solve();
    
    return 0;
    
}

 

Codevs 1046 旅行家的预算 贪心

标签:需要   出发点   ace   加油站   min   贪心   input   div   std   

原文地址:http://www.cnblogs.com/douzujun/p/7944663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!