• 旅行家的预算


    原题链接: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
    ",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 }
  • 相关阅读:
    PHP MySQL 插入多条数据
    PHP MySQL 插入数据
    PHP MySQL 创建数据表
    PHP MySQL 创建数据库
    PHP 连接 MySQL
    PHP MySQL 简介
    PHP JSON
    12_短信发送器_发送短信实现
    11_短信发送器_快速回复页面实现
    10_短信发送器_获取电话号码
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7523870.html
Copyright © 2020-2023  润新知