zoukankan      html  css  js  c++  java
  • ZOJ 3699

    浙大校内赛的题目,现场比赛的时候只有出两题,后面的模拟题都没时间做了。

    题意:一辆汽车有个油箱,问他在经过n个加油站后能否到达目的地。每个加油站都有到下一加油站的距离和每升油的价格。

    就是模拟过程,假设你是开车的你会怎么做,当然是尽量多的使用便宜的油。具体做法见代码:

    View Code
    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int Max = 100009;
    #define LL long long
    struct sta{
        LL x,y,vul;
    }pos[Max];
    
    struct oil {
        LL v,c;
    };
    
    oil sk[Max];
    
    int main() {
        int T;
        scanf("%d",&T);
        while(T--) {
            LL n,full;
            scanf("%lld%lld",&n,&full);
            for(int i = 0; i < n; i++) {
                scanf("%lld%lld%lld",&pos[i].x,&pos[i].y,&pos[i].vul);
            }
            
            LL ans = 0;
            int fro = 1,top = 0;
            LL now = 0;
            for(int i = 0; i < n; i++) {
                while(pos[i].vul < sk[top].c) {
                    now -= sk[top].v;
                    sk[top].v = 0;
                    sk[top].c = 0;
                    top--;
                }
                top++;
                sk[top].c = pos[i].vul;
                sk[top].v = full - now;
                now = full;
                LL need = pos[i].x * pos[i].y;
                if(need > full){
                    ans = -1;
                    break;
                }
                while(need > 0) {
                    if(sk[fro].v < need) {
                        ans += sk[fro].c * sk[fro].v;
                        now -= sk[fro].v;
                        need -= sk[fro].v;
                        sk[fro].v = 0;
                        sk[fro].c = 0;
                        fro++;
                    }
                    else {
                        ans += sk[fro].c * need;
                        sk[fro].v -= need;
                        now -= need;
                        need = 0;
                    }
                }
            }
            if(ans == -1)
                printf("Impossible\n");
            else
                printf("%lld\n",ans);
        }
        return 0;
    }
  • 相关阅读:
    select 1 from ... sql语句中的1代表什么意思?
    装饰者模式
    Dao层抽取BaseDao公共方法
    DBUtils工具类
    java Page分页显示
    QTP
    Gym 100513F Ilya Muromets(前缀和)
    AcWing1165 单词环(01分数规划)
    AcWing904 虫洞(spfa判负环)
    AcWing1148 秘密的奶牛运输(次小生成树)
  • 原文地址:https://www.cnblogs.com/gray035/p/3036762.html
Copyright © 2011-2022 走看看