P1016 旅行家的预算——贪心
贪心求,在当前点如果能到达距离最近的油价比他小的就直接去油价比他小的,
如果在可行范围内没有比他油价小的,就加满开到可行范围内油价最小的点;
这么做是对的,我不会证明;
还有就是,如果变量定义在外面了,在for循环里面就不要定义了,这个点卡了我一下午;
一直停止运行……
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=520; typedef double dd; struct node { dd p,dis; }s[maxn]; dd all_dis,capa,per_dis,st_p; int n; bool cmp(node qw,node we) { return qw.dis<we.dis; } dd ans_cost,last; int main() { scanf("%lf%lf%lf%lf%d",&all_dis,&capa,&per_dis,&st_p,&n); s[0].p=st_p; for(int i=1;i<=n;i++) { scanf("%lf%lf",&s[i].dis,&s[i].p); } s[n+1].dis=all_dis; for(int i=0;i<=n;i++) { if(s[i+1].dis-s[i].dis>capa*per_dis) { printf("No Solution\n"); return 0; } } sort(s+1,s+n+1,cmp); for(int i=0;i<=n+1;) { int j,k; for(j=k=i+1;j<=n;j++) { k=(s[j].p<=s[k].p?j:k); if(s[j].p<=s[i].p||(s[j+1].dis-s[i].dis)>capa*per_dis) break; } if(s[j].p>s[i].p) { ans_cost+=(capa-last)*s[i].p; last=capa-((s[k].dis-s[i].dis)/per_dis); i=k; } else { ans_cost+=((s[j].dis-s[i].dis)/per_dis-last)*s[i].p; last=0; i=j; } } printf("%.2lf",ans_cost); return 0; }