expedition(poj2431_优先队列)

1,我奇奇怪怪。必须得刷题啊。

2,代码不难懂,但是你能想到这个东西就挺nbl .

#include<iostream>
#include<queue>
using namespace std;
priority_queue<int> que;
int n,l,p,a[1005],b[1005];
int ans,pos,tank;
int main(){
    cin>>n>>l>>p;
    for(int i=0;i<n;i++){cin>>a[i];cin>>b[i];
    }
    a[n]=l;
    b[n]=0;
    n++;
    ans=0;
    pos=0;
    tank=p;
    for(int i=0;i<n;i++)
    {
        int d=a[i]-pos;//目前该车距离加油站的位置。 
        while(tank-d<0)
        {
            if(que.empty())
            {
                puts("-1");
                break;
            }
            tank+=que.top();
            que.pop();
            ans++;
        }
        tank-=d;
        pos=a[i];
        que.push(b[i]);
    }
    cout<<ans<<endl;
} 

3,额一遍过。。似乎比dp要那啥一些。

4,这个题的思维挺重要,建模也很重要。

在到达i加油站时,可认为在之后任意时刻都可以加这里的油。。

感觉我前面做的比如a[i]=l,b[i]=0,感觉是在补这个模型。以及pos=0,感觉题目就是一个大部分都完成了的模型,

你就需要补一下模型,然后按着题目往下做就可以了。

一个数据也不一定对!!!!我用脑子想了一遍发现果然有个地方有点问题。

5,那就开始费大和费小了,

费大主要是你要类比出这个思想,

经过即拥有。我用小说这里面的也不好套。

这个弄反你怎么解释。不行就模拟呗。,,

你这相当于每次都加油。。肯定算不出最小值的。

#include<iostream>
#include<queue>
using namespace std;
int n,l,p,a[1005],b[1005];
int ans,pos,tank;
priority_queue<int> que;
int main(){
    cin>>n>>l>>p;
    for(int i=0;i<n;i++){cin>>a[i];cin>>b[i];
    }
    a[n]=l;
    b[n]=100;
    n++;
    ans=0;
    pos=0;
    tank=p;
    for(int i=0;i<n;i++)
    {
        int d=a[i]-pos+pos-pos;
        while(tank-d>=0)
        {
            tank-=d;
            pos=a[i];
            que.push(b[i]);
        }
        if(que.empty())
            {
                puts("-1");
                break;
            }
            tank+=que.top();
            que.pop();
            ans++;
        
    }
    cout<<ans<<endl;
}

6,那让我模拟一下正常的。while的意义是过不去才去加油。

posted @ 2020-01-15 13:53  北月真好  阅读(138)  评论(0编辑  收藏  举报