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的意义是过不去才去加油。