感觉自己做的题还是太少了或者是理解能力太差了,老是望偏的地方想,弄的跟每道题都好像很难的样子! 这道题采用的是贪心算法和最优队列结合的方法,如果卡车里的燃料可以够到城镇就结束,如果不够,为了加油次数最少,就要在所能经历的城镇里选择可以加的油最多的城镇,如果还没有找到加油站加油卡车里油就没有了,那么卡车就不能到达城镇的! #include<iostream> #include<queue> using namespace std; typedef struct fun { int dis,fule; }p; int cmp(const void *a,const void *b) { fun *c=(fun *)a; fun *d=(fun *)b; return d->dis-c->dis; } fun a[1000005]; int main() { int N,i,F,L,sum=0; cin>>N; for(i=0; i<N; i++) cin>>a[i].dis>>a[i].fule; qsort(&a,N,sizeof(fun),cmp);//按照距离降序排列的 cin>>L>>F; priority_queue<int>q; i=0; q.push(F); int temp=0; while(L>temp && !q.empty()) { sum++; temp+=q.top(); q.pop(); while(L-a[i].dis<=temp && i<N)//可以经过的 { q.push(a[i].fule); i++; } } if(L<=temp) cout<<sum-1<<endl; else cout<<"-1"<<endl; return 0; }