1033.To Fill or Not to Fill

1033.To Fill or Not to Fill

题目分析

Input:
第一行:Cmax D Davg N
接下来的N行:Pi Di
Output:(accurate up to 2 decimal place)
Case1:minimum price
Case2:The maximum travel distance = xxx

贪心策略

  • 在distance=0的地方必须有加油站
  • 在distance=D的地方(终点),油箱里油的剩余量必须为0
  • 假设某一站为A,则如果在A加满油,能行驶的最远距离为maxDis=Cmax*Davg
  • 使用leftGas变量来记录剩余油量
  1. 在A.distance~A.distance+maxDis之间寻找第一个比A便宜的站,如果找到,记为B,则在A加刚好行驶至B的油量
  2. 若没有符合情况1的站,但是有终点,则在A加刚好可以行驶至终点的油量
  3. 若没有符合情况1和情况2的站,则找一个站C,C.price在相应范围内最小,在A加满油,行驶至C
  4. 不是情况1、2、3的任何一种情况,则行驶的最大距离为A.distance+maxDis

C++源码

#include
#include
#include
using namespace std;

#define INF 99999

typedef struct Station
{
    double price;
    double distance;
}Station;

// the pointer tempA can point to a value of any type but the value must be a constant
int cmp(const void* tempA,const void* tempB)
{
    Station *a = (Station*)tempA;
    Station *b = (Station*)tempB;
    return a->distance - b->distance;
}

int main()
{
    int N;
    double Cmax, D, Davg;
    cin>>Cmax>>D>>Davg>>N;
    Station *stations = new Station[N+1];
    for(int i = 0; i < N; i++)
    {
        cin>>stations[i].price>>stations[i].distance;
    }
    stations[N].price = INF;
    stations[N].distance = D;
    qsort(stations, N+1, sizeof(Station), cmp);

    // if there is no station at the beginning
    if(stations[0].distance != 0)
    {
        cout<<"The maximum travel distance = 0.00"<

你可能感兴趣的:(1033.To Fill or Not to Fill)