PAT Advanced 1033 To Fill or Not to Fill (25) [贪?算法]

题目

With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Diferent gas station may give diferent price. You are asked to carefully design the cheapest route to go.
Input Specification:
Each input file contains one test case. For each case, the first line contains 4 positive numbers: Cmax (<=100), the maximum capacity of the tank; D (<=30000), the distance between Hangzhou and the destination city; Davg (<=20), the average distance per unit gas that the car can run; and N (<= 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: Pi, the unit gas price, and Di (<=D), the distance between this station and Hangzhou, for i=1,…N. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print “The maximum travel distance = X” where X is the maximum possible distance the car can run, accurate up to 2 decimal places.
Sample Input 1:
50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300
Sample Output 1:
749.17
Sample Input 2:
50 1300 12 2
7.10 0
7.00 600
Sample Output 2:
The maximum travel distance = 1200.00

题目分析

从初始地到目的地,已知沿途高速各加油站价格,找出最省钱的加油方式

解题思路

  1. 如果一整箱油可行驶距离<当前站到下一站的距离,那么车子无法到达下一站,打印最远行驶距离(即当前站距起始点距离+一整箱油可行驶距离)
  2. 在一整箱油可到达的距离内,(当前站记为A站,后续油站中最低油价站记为B站,后续油站中小于当前站油价价格的站记为C站)
    2.1 如果当前站价格后续油站中最低价还低,加满油直到后续油站中最低价油站B(到达B站后可能油箱还有剩余)
    2.2 如果后续油站中能找到小于当前站油价的站C,加油量=刚好到达C站,在C站再加油(到达C站无剩余油)
  3. 将目的地记做"最后一个加油站",其油价设置为0(作为哨兵),若目的地为当前站一整箱油可达距离内,加油量只需要当前站到达最后目的地即可,无需多余

Code

Code 01

#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;
const double inf = 99999999;
struct station {
    double d; // distance
    double p; // price
};
bool cmp(station &s1,station &s2) {
    return s1.d<s2.d;
}
int main(int argc, char * argv[]) {
    double CM,D,DA;
    int N;
    scanf("%lf %lf %lf %d",&CM,&D,&DA,&N);
    vector<station> vss(N+1);
    for(int i=0; i<N; i++) {
        scanf("%lf %lf", &vss[i].p, &vss[i].d);
    }
    vss[N].d=D,vss[N].p=0.0; //哨兵
    sort(vss.begin(),vss.end(),cmp); //按照距离排序

    if(vss[0].d!=0) {
        //起始油箱空,并且起始位置没有加油站
        printf("The maximum travel distance = 0.00"); //注意是0.00,而不是0,否则第三个测试点错误
        return 0;
    }
    double nowd=0.0,nowp=vss[0].p,fd=0.0,ap=0.0; //ap总费用;fd到站油箱剩余油可行驶路程
    double SM = CM*DA; //一箱油可行驶路程
    while(nowd<D) {
        int maxd=nowd+SM; // 当前邮箱加满可行驶的最远距离
        double minp=inf,mind=0.0;
        bool flag = false;
        for(int i=0; i<=N&&vss[i].d<=maxd; i++) {
            if(vss[i].d<=nowd)continue;
            if(vss[i].p<nowp) {
                ap+=(vss[i].d-nowd-fd)*nowp/DA;
                nowd=vss[i].d;
                nowp=vss[i].p;
                fd=0.0; //加的油刚好到最低价的油站
                flag = true;
                break;
            }
            if(minp>vss[i].p) {
                minp=vss[i].p;
                mind=vss[i].d;
            }
        }
        if(!flag&&minp!=inf) { // 之后的站没有比当前站价格更便宜,取后面站中最低价的站C
            //因为当前站价格更低,装满油箱,行驶到C站,再加油
            ap+=((CM-fd/DA)*nowp);
            fd=SM-(mind-nowd);
            nowd=mind;
            nowp=minp;
        }
        if(!flag&&minp==inf) { // 即使油箱满油,也不足以行驶到下一站
            printf("The maximum travel distance = %.2f", nowd+SM);
            return 0;
        }
    }
    printf("%.2f", ap);
    return 0;
}

原文地址:https://www.cnblogs.com/houzm/p/12242952.html

时间: 2024-11-08 23:33:04

PAT Advanced 1033 To Fill or Not to Fill (25) [贪?算法]的相关文章

PAT (Advanced Level) 1097. Deduplication on a Linked List (25)

简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<queue> #include<stack> #include<algorithm> using namespace std; const int maxn=100000+10; int root,n; struct No

PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)

树的遍历. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<iostream> #include<algorithm> using namespace std

PAT (Advanced Level) 1006. Sign In and Sign Out (25)

简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<vector> using namespace std; struct X { string name; int a,b; }s[10000]; int n,hh,mm,ss; bool cmp1(const X&a,co

PAT (Advanced Level) 1090. Highest Price in Supply Chain (25)

简单dfs. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<map> #include<queue> #include<stack> #include<vector> using namespace std; const int maxn=100000+10; vector<int>g[

PAT (Advanced Level) 1106. Lowest Price in Supply Chain (25)

简单dfs #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<queue> #include<stack> #include<algorithm> using namespace std; const int maxn=100000+10; vector<int>g[m

PAT Advanced 1043 Is It a Binary Search Tree (25分)

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes with keys greate

PAT Advanced 1037 Magic Coupon (25) [贪?算法]

题目 The magic shop in Mars is ofering some magic coupons. Each coupon has an integer N printed on it, meaning that when you use this coupon with a product, you may get N times the value of that product back! What is more, the shop also ofers some bonu

PAT Advanced 1067 Sort with Swap(0,*) (25) [贪?算法]

题目 Given any permutation of the numbers {0, 1, 2,-, N-1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the f

PAT Basic 1020 ?饼 (25) [贪?算法]

题目 ?饼是中国?在中秋佳节时吃的?种传统?品,不同地区有许多不同?味的?饼.现给定所有种类?饼的库存量.总售价.以及市场的最?需求量,请你计算可以获得的最?收益是多少. 注意:销售时允许取出?部分库存.样例给出的情形是这样的:假如我们有3种?饼,其库存量分别为18.15.10万吨,总售价分别为75.72.45亿元.如果市场的最?需求量只有20万吨,那么我们最?收益策略应该是卖出全部15万吨第2种?饼.以及5万吨第3种?饼,获得 72 + 45/2 = 94.5(亿元). 输?格式: 每个输?包