• PAT 1033


    JAVA没法玩耍系列,这道题限时10ms,所以我也不知道到底对不对,反正示例是正确的

    贪心法,对于我来说很绕的贪心法。

    分为下面的步骤

    在满油情况下能够跑到的所有加油站中搜索

    1. 如果该加油站比当前加油站要便宜,则加油到刚好跑到这个加油站,继续下一轮

    2. 如果到了终点,则加油到终点,用哨兵保证这一点

    3. 如果在这段区间,没有找到比当前加油站更便宜的加油站,则加油到满油

    其实就是顺序没处理好所以做了很长时间,原来的做法是依次向后找到最便宜的加油站,如果超过最大距离了又怎么样,这就不如限定在一个范围内找加油站了

    感觉学到了一些,要把通用情况放到最外面判断。

    代码如下:

      1 import java.util.*;
      2 import java.io.*;
      3 
      4 class FastReader{
      5     BufferedReader reader;
      6     StringTokenizer tokenizer;
      7     
      8     public FastReader(InputStream stream){
      9         reader = new BufferedReader(new InputStreamReader(stream), 1 << 22);
     10         tokenizer = null;
     11     }
     12     
     13     public String next(){
     14         while (tokenizer == null || !tokenizer.hasMoreTokens()){
     15             try { 
     16                 tokenizer = new StringTokenizer(reader.readLine());
     17             } catch (Exception e){
     18                 //System.out.println(-1);
     19                 throw new RuntimeException(e);
     20             }
     21         }
     22         
     23         return tokenizer.nextToken();
     24     }
     25     
     26     public int next_int(){
     27         return Integer.parseInt(next());
     28     }
     29     
     30     public float next_float(){
     31         return Float.parseFloat(next());
     32     }
     33 }
     34 
     35 class StationInfo{
     36     float dist;
     37     float price;
     38 }
     39 
     40 public class Main {
     41     public static void main(String[] args){
     42         FastReader reader = new FastReader(System.in);
     43         float cap, dist, avg_dist;
     44         int num;
     45         
     46         cap = reader.next_float();
     47         dist = reader.next_float();
     48         avg_dist = reader.next_float();
     49         num = reader.next_int();
     50         
     51         float longest_run = avg_dist * cap;
     52         StationInfo[] stations = new StationInfo[num + 1];
     53         for (int i = 0; i < num; i++){
     54             stations[i] = new StationInfo();
     55             stations[i].price = reader.next_float();
     56             stations[i].dist = reader.next_int();
     57         }
     58         stations[num] = new StationInfo();
     59         stations[num].dist = dist;
     60         stations[num].price = 0;
     61         
     62         Arrays.sort(stations, new Comparator<StationInfo>(){
     63             public int compare(StationInfo s1, StationInfo s2){
     64                 return (s1.dist - s2.dist < 0.0f) ? -1 : 1;
     65             }
     66         });
     67         
     68         for (int i = 0; i < stations.length - 1; i++){
     69             if (stations[i + 1].dist - stations[i].dist > longest_run){
     70                 float max_travel = stations[i].dist + longest_run;
     71                 System.out.println(String.format("The maximum travel distance = %.2f", max_travel));
     72                 return;
     73             }
     74         }
     75         
     76         if (stations[0].dist != 0.0f)
     77             System.out.println(String.format("The maximum travel distance = %.2f", 0.0f));
     78         
     79         int cur_station = 0;
     80         float cur_oil = 0.0f;
     81         float cost_sum = 0.0f;
     82         while (cur_station < num){
     83             float cur_run = 0.0f;
     84             int next_station = cur_station;
     85             int lowest_price_station = cur_station;
     86             float lowest_price = Float.MAX_VALUE;
     87             boolean solved = false;
     88             while (true){
     89                 float cur_dist = stations[next_station + 1].dist - stations[next_station].dist;
     90                 if (cur_dist + cur_run > longest_run)
     91                     break;
     92                 cur_run += cur_dist;
     93                 next_station++;
     94                 
     95                 if (stations[next_station].price < stations[cur_station].price){
     96                     float need_oil = cur_run / avg_dist;
     97                     float add_oil = (cur_oil > need_oil) ? 0.0f : (need_oil - cur_oil);
     98                     cost_sum += add_oil * stations[cur_station].price;
     99                     
    100                     cur_oil = cur_oil + add_oil - need_oil;
    101                     cur_station = next_station;
    102                     
    103                     solved = true;
    104                     break;
    105                 }
    106                 
    107                 /*
    108                 if (next_station != cur_station){
    109                     if (stations[next_station].price < lowest_price){
    110                         lowest_price_station = next_station;
    111                         lowest_price = stations[next_station].price;
    112                     }
    113                 }
    114                 */
    115             }
    116             
    117             if (!solved){
    118                 float add_oil = cap - cur_oil;
    119                 cost_sum += add_oil * stations[cur_station].price;
    120                 cur_oil += add_oil;
    121                 cur_oil -= cur_run / avg_dist;
    122                 cur_station = next_station;
    123             }
    124         }
    125         
    126         System.out.println(String.format("%.2f", cost_sum));
    127     }
    128 }
  • 相关阅读:
    Python (time、datetime、random、os、sys、shutil)模块的使用
    ELK6+filebeat、kafka、zookeeper搭建文档
    JDBC-用Java语句操作数据库
    数据库对象
    sql之子查询
    函数之sql语句
    sql之select语句
    oracle 数据库
    网络编程
    多线程——多线程的运行轨迹,线程的生命周期,线程的常用方法,线程的安全问题,死锁,线程间的通信
  • 原文地址:https://www.cnblogs.com/EpisodeXI/p/4072067.html
Copyright © 2020-2023  润新知