首页 > 其他分享 >51nod-1288汽油补给

51nod-1288汽油补给

时间:2024-07-24 22:32:21浏览次数:15  
标签:cur 51nod tt 汽油 1288 int hh ans dis

1288 汽油补给

https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337

image-20240724221602151

  1. 这道题算DP纯粹是个幌子,其实就是一个贪心的过程。

  2. 为什么要留后面价格贵的油?因为可能不够用,先存着;而如果前面的贵,由于有 \(T\) 限制,所以在能够装满的同种情况下,用后面的油价格更低。我们这个计算是用多少算多少,就跟洛谷计算空间一样,存下来的油用不完反正没有计入总费用中。

具体而言,枚举到一个 \(i\),先看一下满油能否到达下一个位置,然后先在出发前替换劣油,最后计算到达 \(i+1\) 的消耗。

#include<iostream>
using namespace std;
typedef long long ll;
const int N=100010;
int n,t,d[N],p[N],cur,q[N];
ll ans;
int main(){
    #ifdef LOCAL
    freopen("1.txt","r",stdin);
    #endif
    #ifndef LOCAL
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    #endif
    cin>>n>>t;
    int hh=0,tt=-1;
    for(int i=0;i<n;++i){
        cin>>d[i]>>p[i];
        int dis=d[i];
        if(t<d[i]){
            cout<<"-1";
            return 0;
        }
        while(hh<=tt&&p[q[tt]]>=p[i]){
            cur-=d[q[tt]];
            --tt;
        }
        d[i]=t-cur;
        q[++tt]=i;
        cur=t-dis;
        while(hh<=tt){
            int f=q[hh++];
            if(d[f]>=dis){
                d[f]-=dis;
                ans+=1ll*dis*p[f];
                if(d[f])--hh;
                break;
            }
            else dis-=d[f],ans+=1ll*d[f]*p[f];
        }
    }
    cout<<ans;
    return 0;
}

标签:cur,51nod,tt,汽油,1288,int,hh,ans,dis
From: https://www.cnblogs.com/wscqwq/p/18321895

相关文章

  • 51nod-3983走方格
    https://class.51nod.com/Html/Textbook/Problem.html#problemId=3983&textbookChapterId=724https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337移动与时间段有关,如果按照时间段划分状态那么每一段内只有一条线性的转移。需要一行一行或......
  • 51nod2599 最近公共祖先LCA
    给定一颗n个节点的树,根节点编号为1,有Q组询问,每次给定一对节点编号(x,y),求(x,y)的最近公共祖先。求LCA有多种方法,这里给的是倍增法,预处理时间O(nlogn),单次查询时间O(logn),支持在线。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for......
  • 51nod1174 区间中最大的数RMQ
    给出一个有n个数的序列,下标0~n-1,有Q次查询,每次询问区间[l,r]的最大值。如果有修改,可以考虑线段树,这里只有静态查询,可以用ST表,预处理时间O(nlogn),单次查询时间O(1)。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for(inti=a;i<=b;i......
  • CF1288题解
    CF1288EducationalCodeforcesRound80(RatedforDiv.2)A略CF1288BlinkCF1288B题意给定\(A,B\),问有多少个二元组\((a,b)\)满足\(1\lea\leA,1\leb\leB\)且\(a\cdotb+a+b=\operatorname{conc}(a,b)\)。其中\(\operatorname{conc}(a,b)\)表示将\(a,b\)......
  • 51nod 2620 序列问题
    原题首先\(O(n\logn)\)的贪心很好想,显然用堆,每次合并两个权值最小的即可然后考虑\(O(n)\)怎么做?我们发现这个权值\(\max(a_i,a_{i+1})\)的\(\max\)很不好处理,因此我们考虑把他优化一下使用单调栈可以求出权值为\(a_i\)的合并区间,然后我们发现对于合并一个区间答案......
  • 51nod 3179 绝世好题
    原题确实是绝世好题朴素\(dp\)问题非常simple,考虑优化想尽数据结构无从下手?既然二进制考虑按位贪心发现对于\(a_i\)所有为\(1\)的位上一位只要有一位为\(1\)即可,剩下的显然越靠后越好因此我们设\(dp_{i,j}\)表示前\(i\)个数,其中最后一个被选的数第\(j\)位为......
  • 51NOD 1258 自然数幂和
    题目链接description\(T\)次询问,每次给定\(n,k\),求\(\sum\limits_{i=1}^ni^k\)模1e9+7.\(n\leq10^{18},k\leq5\times10^4\)solution可以拉插用什么多项式考虑将\(n\)带入\(f(x)=\sum\limits_{i=1}^xi^k\)。可以证明,\(f(x)\)是一个\(k+1\)次多项式。一种感......
  • 51Nod 试题泛做1
    A-排船的问题很显然,这个数据范围用二分来找这个最长的最短是OK的,然后我们就判断一下二分到的东西,用一个贪心,就是尽可能将每一个往左边放,但不能与船重叠,也不能超过我们二分到的最长的绳的长度,因为要尽可能给后面留出空间,让后面的绳的长度不超过我们二分到的长度。然后如果最后极......
  • 51nod-1605 棋盘问题
    原题链接1605 棋盘问题基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的。亚当和夏娃在玩一个游戏,每次寻找边长为x的正方形,其中每个格子必须为黑色......
  • 51nod-1086 背包问题(多重背包)
    原题链接1086 背包问题 V2基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注Input第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000)第2 - N......