旅行家的预算

时间:2023-01-09 10:22:36

原题链接:https://www.luogu.org/problem/show?pid=1016#sub

完全平方懵逼。

思路倒是明确,然而卧槽怎么就是写不出来呢?

其实是一个贪心思想,对于这个油箱,我们可以把它里面的油看作一份一份的,每一份的价格可能不一样。

每到一站,我们直接把油加满,然后判断车能到达的下一个比当前价格便宜的站是哪里,然后就让车去那个站。

我们在更新油的时候是和日常生活不太一样的。如果遇到便宜的油应该加满,原来的那些贵油应该舍弃。

这样,我们只需要记录一下车到每个站的剩余油量和加满油所需要的油量就好。

最后输出每个站应该加的油量乘油单价就好了。。。

可是为什么记录需要加油的量数组一直都是0呢。。我死活调不出来了。。求助。。

 1 //这是一个不能AC的代码!!
2 #include <iostream>
3 #include <cstdio>
4 #define maxn 555
5 #define check cout << "ok" << endl;
6 using namespace std;
7 double cost[maxn];
8 double remain_oil[maxn];
9 double dis[maxn];
10 double add_oil[maxn];
11 double d1,c,d2,p;
12 int n;
13 bool flag = false;
14 int main(){
15 cin >> d1 >> c >> d2 >> p >> n;
16 for (int i=1;i<=n;i++){
17 cin >> dis[i] >> cost[i];
18 }
19 dis[++n] = d1;
20 cost[n] = 0;
21 cost[0] = p;
22 //判断无解
23 double maxl = c * d2;
24 if (n==0){
25 if (maxl < d1)
26 cout << "No Solution" << endl;
27 else{
28 double ans = d1 * p / d2;
29 printf("%.2f\n",ans);
30 }
31 return 0;
32 }
33 double prev = 0;
34 for (int i=1;i<=n;i++){
35 double segdis = dis[i] - prev;
36 if (maxl - segdis < 0)
37 flag = true;
38 prev = dis[i];
39 }
40 if (d1 - dis[n] > maxl)
41 flag = true;
42 int i = 0;
43 int j;
44 if (flag)
45 cout << "No Solution" << endl;//判断无解到此结束
46 else{//正片开始
47 do {
48 j = i + 1;
49 while(dis[j] - dis[i] <= maxl){
50 if (cost[j] < cost[i])
51 break;
52 j++;
53 }
54 if (dis[j] - dis[i] <= maxl)
55 if (remain_oil[i]*d2 >= dis[j] - dis[i])
56 remain_oil[j] = remain_oil[i] - (dis[j] - dis[i]) / d2;
57 else{
58 add_oil[i] = (dis[j] - dis[i]) / d2 - remain_oil[i];
59 cout << add_oil[i] << "~" << endl;
60
61 }
62 else{
63 add_oil[i] = c - remain_oil[i];
64 j = i+1;
65 remain_oil[j] = c - (dis[j] - dis[i]) / d2;
66 }
67 i = j;
68 } while(i==n);
69 }
70 double ans = 0;
71 for (int i=0;i<=n-1;i++)
72 ans += add_oil[i] * cost[i];
73
74 // for (int i=1;i<=n;i++)
75 // cout << add_oil[i] << " " << cost[i] << endl;
76 printf("%.2f",ans);
77 return 0;
78 }