这题就是说汽车开始0油,然后给出总路程,每公里汽车能够跑的路程,测试用例数量,
每个测试用例给出价钱和距离。这题刚开始没有思路,以前见过没有思路后来绕过去没想到在pat上又遇到了,看了题解后来恍然大悟,这个贪心技巧以前没有见过。
- 具体的贪心思路:核心:将油预储存,将油分成块,背包里可能多个地方的油但是不一定用,每到一个地方都要把油加满。这里就是处理的核心关键:加油的时候淘汰背包里面价格比当前位置贵的油。每次使用油的时候,有限用最便宜的油,如果没用完还要考虑。
- 用treemap存入<距离,价格>,因为要从0开始经过。保证可能达到的所有情况可以到达。用优先队列存入当前油,当然,你还要记录油的总量,钱的总量和当前位置,还要判断油是否能够到达当前点。
- 但是这个是double类型变量,,准确度。。。吐槽一下,我在牛客的最后一个案例错了,但是到pat官网上全部通过,我复制牛客上AC代码到pat上就过了三组数据,,真坑!附上代码:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.util.Comparator; import java.util.Map; import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; public class Main { public static void main(String[] args) throws IOException { StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); double cmax=in.nval;//最大容量 in.nextToken();double distance=in.nval;//距离 in.nextToken();double ave=in.nval;//每一个气能跑的距离 in.nextToken();int n=(int)in.nval;//数量 Map map=new TreeMap(); map.put(distance, Double.MAX_VALUE); for(int i=0;iq1=new PriorityQueue(cmp);//两个做中转处理 Queueq2=new PriorityQueue(cmp); for(double k:map.keySet()) { //if(k>=distance) {k=distance;} if(oilnumber*ave<(k-index)) {b=true;index =oilnumber*ave;break;}//跑到截至 else { double length=0; while(length(k-index))//能够多出部分 { oilnumber-=(k-index-length)/ave; exam.value-=(k-index-length)/ave; money =(k-index-length)/ave*exam.price; length=k-index; q1.add(exam); } else//跑不完 { money =exam.value*exam.price; oilnumber-=exam.value; length =exam.value*ave; } } index=k; //开始加油工作//淘汰旧油 if(k=distance) {break;} } //out.println(" " k " " map.get(k) " " money); } if(index==distance) out.println(String.format("%.2f", money)); else out.println("The maximum travel distance = " String.format("%.2f", index)); out.flush(); } public static Comparatorcmp=new Comparator() { @Override public int compare(oil o1, oil o2) { return (o1.price-o2.price)>0?1:-1; } }; public static class oil { public double price;//价格 public double value;//余量 public oil() { } public oil(double price,double value) { this.price=price; this.value=value; } } }
大体的逻辑没啥问题,对集合的掌握理解要高,可能有些小瑕疵如果发现请找出来。