PAT 甲级 A1033 (2019/02/19)

#include<cstdio>
#include<algorithm>
using namespace std;
const int INF = 1000000000;     //初始化最低油价
struct station{
    double oil_price;   //加油站油价
    int distance;       //加油站离出发点的距离
}sta[501];
bool cmp(station a, station b){
    return a.distance < b.distance;     //各个加油站,按照与出发点的距离从小到大排序
}
int main(){
    double V, D, D_V;
    int station_number;
    scanf("%lf %lf %lf %d", &V, &D, &D_V, &station_number);
    //把终点看作为一个加油站,则station + 1
    for(int i = 0; i < station_number + 1; i++){
        //如果,i为最后一个加油站,初始化最后一个加油站,即终点
        if(i == station_number){
            sta[i].oil_price = 0;
            sta[i].distance = D;
        }else{  //否则,输入剩余的加油站信息
            scanf("%lf %d", &sta[i].oil_price, &sta[i].distance);
        }
    }
    sort(sta, sta + station_number, cmp);
    //排序后,如果没有距离与出发点为0的加油站,则无法出啊,距离为0;
    if(sta[0].distance != 0){
        printf("The maximum travel distance = 0.00");
    }else{  //否则,能出发
        int now = 0;    //当前所处的加油站的编号
        //总花费, 当前油量, 满油行驶的距离
        double ans = 0, nowTank = 0, MAX = V * D_V;
        while(now < station_number) {//每次循环选出下一个需要到达的加油站
        //选出从当前加油站满油能到达范围内的第一个油价低于当前油价的加油站,
            //如果没有低于当前油价的加油站,则选择油价最低的那个
            int k = -1;         //最低油价的加油站的编号
            double priceMin = INF;      //最低油价
            for(int i = now + 1; i <= station_number && sta[i].distance - sta[now].distance <= MAX; i++) {
                if(sta[i].oil_price < priceMin) {       //如果油价比当前油价低
                    priceMin = sta[i].oil_price;        //更新最低油价
                    k = i;
                    if(priceMin < sta[now].oil_price) {
                    //如果找到第一个油价低于当前油价的加油站,直接中断循环
                        break;
                    }
                }
            }
            if(k == -1) break;  //油箱已满的情况下,无法加油,即为不需找加油站,退出循环
            //下面为计算能到达的加油站k,计算转移所用的油费
            //need为:从now到k所需要的油量
            double need = (sta[k].distance - sta[now].distance) / D_V;
            if(priceMin < sta[now].oil_price) {     //如果加油站k的油价低于当前油价
                //只卖够到达加油站k的油
                if(nowTank < need) {        //如果当前油量不足need
                    ans += (need - nowTank) * sta[now].oil_price;       //补足need
                    nowTank = 0;        //到达加油站,油箱油量置为0,即为空
                } else {        //如果油量超过need
                    nowTank -= need;        //直接到达加油站k
                }
            } else {        //如果加油站k的油价高于当前的油价
                ans += (V - nowTank) * sta[now].oil_price;
                //到达加油站k后,把油箱内油量设置为 V - need
                nowTank = V - need;
            }
            now = k;    //到达加油站k,进入下一层循环
        }
        if(now == station_number) { //能到达终点
            printf("%.2f\n", ans);
        } else {    //到不了终点
            printf("The maximum travel distance = %.2f\n", sta[now].distance + MAX);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zjsaipplp/p/10425235.html

时间: 2024-11-03 00:57:15

PAT 甲级 A1033 (2019/02/19)的相关文章

PAT 甲级 A1048 (2019/02/19)

#include <cstdio> #include <algorithm> using namespace std; const int N = 1005; int HashTable[N]; int main() { int n, m, a; scanf("%d %d", &n, &m); for(int i = 0; i < n; i++) { scanf("%d", &a); ++HashTable[a]

PAT 甲级 A1077 (2019/02/19)

#include<cstdio> #include<cstring> int n, minlen = 256, cnt = 0; char str[100][256]; int main(){ scanf("%d", &n); getchar(); //接收换行符 for(int i = 0; i < n; i++){ fgets(str[i],256,stdin); int len = strlen(str[i])-1; if(len <

PAT 甲级 A1070 (2019/02/19)

#include<cstdio> #include<algorithm> using namespace std; struct Mooncake{ double inventory; //库存 double total_value; //总价 double unit_price; //单价 }cake[1001]; bool cmp(Mooncake a, Mooncake b){ return a.unit_price > b.unit_price; //按照单价从高到低

PAT 甲级 A1050 (2019/02/19)

#include<cstdio> #include<cstring> char str1[10010], str2[10010]; bool HashTable[128]; int main(){ fgets(str1,10010,stdin); fgets(str2,10010,stdin); int len1 = strlen(str1); int len2 = strlen(str2); for(int i = 0; i < len2; i++){ HashTable[

PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】

Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, unsuspecting victims lose their entire life savings. To stop this crime, you are supposed to write a program to detect those suspects from a huge amount of phone c

吾尝终日而思矣——2019.02.19

1.享元模式(Flyweight Pattern) 享元模式意在减少新对象的产生,为一个对象建立一个享元工厂类,一般包含一个HashSet容量池.使用工厂类创建新对象,当对象未创建过,创建新对象并存入HashSet里,如果已存在就从HashSet取出,这样就能共享一些对象. PS:这个意译得反而让人摸不着头脑,Flyweight是轻量级的意思. 引用:https://www.cnblogs.com/adamjwh/p/9070107.html 2.装饰器模式 当我们需要对一个类添加功能时,我们可

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

【谜客帝国】第147届月思主擂谜会(2019.02.15)

 [谜客帝国]第147届月思主擂谜会(2019.02.15) 主持计分:东东 1.“人在中天日月间”(9笔字)春/月思 [注:面出陈孚<开平即事二首>,“势超大地山河上,-.”] 2. 玉漏声中烟气袅(3字法国奢侈品牌)YSL/月思 3. 双双相念初相爱(2字著名动漫人物)菜菜/月思 4.“数点燕云州外.雪霜威”(足球用语二,4+3)4132.451/月思 [注:面出余文<相见欢>,“登高望断龙旗,未曾归.几度中原北定,梦依稀.朔风乱,胡尘漫,掩斜晖.-.”] 5.“十载同心如一人

2017.02.19学习C#的第二天,今天我学到了什么?

2017.02.19,今天是学习C#的第二天,今天学习的是: 1.数据类型:(以下是现阶段编程中最经常用到的类型) (1)整型 (2)浮点型 (3)字符型 (4)布尔型 (5)字符串型 (6)日期时间型 2.变量/常量 3.类型转换 (1)显示转换 (2)隐式转换 4.转义字符 一,基本数据类型介绍 1.整形(主要差别在取值范围) (1)byte 取值范围(0--225),超出后系统报错. (2)short 取之范围:byte < shor t< int      快捷方式为Int16 (3)