这道题就是贪心
1、在第一个加油站的时候,如果在加满油能够到达的加油站中有一个加油站的钱比自己的少(其实等于也行),那就 加足够到那个车站的油,直接去那个车站
2、这些车站中所有都比自己大,那就找一个其中钱最少的车站 在当前车站加满油,然后直接开到那个车站
3、然后到达车站时就不断重复以上的处理方法
4、但这样有一个问题就是你无法到达最后一个车站,于是我们把最后一个车站的费用变为0(其实还是-1更保险)这样就保证如果能到,就一定能走到最后一个
车站
5、那么如何判断能否到达呢?如果在一次加油站处理操作时,发现加满油了仍然一个车站都不能到达,那就不能到达了。
下面贴代码,感觉自己写的好丑啊
#include <cstdio> #include <cmath> #include <cstdlib> #include <cstdlib> #include <algorithm> using namespace std ; struct node{ double wei,p ; }; double d1,c,d2,you,w ; double ans ; int n,x,k; double y,mi ; node a[1000011] ; bool f,ff ; bool cmp(node a,node b) { return a.wei<b.wei ; } int main() { scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&a[0].p,&n) ; a[0].wei = 0 ; for(int i=1;i<=n;i++) { scanf("%lf%lf",&a[i].wei,&a[i].p) ; } sort(a+1,a+n+1,cmp) ; a[++n].wei = d1 ; a[n].p = 0 ; x = 0 ; while(x<n) { mi = 1000000000 ; y = a[x].wei + d2*c ; f = false ; ff = false ; for(int i=x+1;x<=n&&a[i].wei<=y;i++) { f = true ; if(a[i].p<=a[x].p) // 等于应该也开的吧 { k = i ; w=(a[i].wei-a[x].wei)/d2 ; if(you>=w) { you-=w ; } else { ans=ans+(w-you)*a[x].p ; you = 0 ; } x = i ; ff = true ; break ; } if(a[i].p<mi) mi = a[ i ].p,k = i ; } if(ff) continue ; if(!f) { printf("No Solution\n") ; return 0 ; } ans = ans + (c-you) *a[x].p ; you = c - (a[k].wei-a[x].wei) /d2 ; x = k ; } printf("%.2lf",ans) ; return 0 ; }
时间: 2024-10-05 06:16:20