pat1033汽车加油问题(Java贪心)

举报
bigsai 发表于 2021/02/03 00:19:41 2021/02/03
【摘要】 这题就是说汽车开始0油,然后给出总路程,每公里汽车能够跑的路程,测试用例数量, 每个测试用例给出价钱和距离。这题刚开始没有思路,以前见过没有思路后来绕过去没想到在pat上又遇到了,看了题解后来恍然大悟,这个贪心技巧以前没有见过。 具体的贪心思路:核心:将油预储存,将油分成块,背包里可能多个地方的油但是不一定用,每到一个地方都要把油加满。这里就是处理的核心关键:加油的时...

这题就是说汽车开始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;
		}
	}
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

大体的逻辑没啥问题,对集合的掌握理解要高,可能有些小瑕疵如果发现请找出来。

文章来源: bigsai.blog.csdn.net,作者:Big sai,版权归原作者所有,如需转载,请联系作者。

原文链接:bigsai.blog.csdn.net/article/details/82498058

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。