PAT A1033 To Fill or Not To Fill 看了书才知道自己的思维不严谨,即使算法大概对,还少了很多

//ac全部正确!果然是晴神宝典 
//有时候程序并没有问题,但是编译器就是会报错时候返回为1,说什么无法打开输出文件,这时把所有运行的本程序关闭,再输出文件刷新一下 
//我的错点:选出最近的油价低于当前油价的加油站 
//算上最后一个加油站,就是从[0,n],所以while(now
#include
#include
//#define LOCAL //这里如果不注释会出现段错误或者答案错误 
using namespace std;
const int maxn=510;
const int INF=1000000000; 
struct station{
	double price,dis;//价格、与起点之间的距离 
}st[maxn];
bool cmp(station a,station b){
	return a.dis



我自己写的,对照一下,差别写在上面的解法的最上方注释

//注意这一题等于号两边是有空格的 
//pat的题目一定要保证精确度!,精确度不够就是答案错误! 
//int r=0,而不是int r.这个小小的地方一改就大部分分数得到了 
//这一题我用%lf格式符输入float型的数据,结果居然赋值进去的是0,所以请严格使用控制字符.但是双精度的输出依然用%f.输入必须用%lf 
//这一题我花不到一个小时还是写完了的 
//最好设置终点为油价为0的加油站,想想为什么 
	/*算法分析:
	(1)寻找距离当前加油站最近的,且油价低于当前油价的加油站(k),在当前加油站加好能够到达k的油,然后开到k站,循环加油
	(2)如果找不到油价低于当前加油站的加油站,找到油价较低的加油站,在本站加满油,然后到k站 
	 (3)如果在满油的状态下到达不了最近的加油站,则用当前加油站的距离+满油行使的距离,就是最大行使距离,退出循环
	 (4)上面的策略在满足条件3或者行使距离到达目的地时结束。 
	*/
//从杭州到别的地方,是这个意思。关关说反正用double不会错 。如果程序返回1说明是陷入了死循环了 
//C,油箱的最大容量。D杭从州到该城市的距离。Davg每升油可以行使的距离。N加油站总数
//Pi单元油价,D这个站到杭州的距离。一开始油箱是空的。结果打印一路上最便宜的价格。如果到不了目的地,打印最大行驶距离。2位小数
#include
#include
#include
#define LOCAL 
using namespace std;
 
struct GasStation{
	double price;
	double distance;
}st[510]; 
bool cmp(GasStation a,GasStation b){
	return a.distance1e-6 
		//当汽车还没有到达重点,关于到不了等等,会用break。如果到达终点站,则D==ans,考虑到小数,就是D-ans<1e-6 
		//是否需要保留当前的i,下次可以从i开始遍历,恩是要这样的。这样可以省时间
		//因为这里已经把终点站设为最后一个价格为0,距离为D的站 
		GasStation right;
		int r=0; //这里一开始没有写int r=0,直接写的 int r .加个i=0,所有能走完的case就都对了! 
		for(int j=i+1;j<=n;j++){//从第一个到第n+1个了 
			//从i到油箱能满的情况
			if((st[j].distance-st[i].distance)>tankD){
				right=st[j-1];//这最后一个j多一个的就是右边界.注意肯定都是在满箱有可到达的情况下的 
				r=j-1;
				break;
			} 
		}
		if(r==i){
			//说明即使加满油,也到不了任何一个加油站
			//ans+=tankD;
			ans=st[i].distance+tankD; 
			printf("The maximum travel distance = %.2lf\n",ans);
			return 0;
		}
		double minprice=st[i+1].price;//设置离它最近的一个为最小油价处 
		int mindex=i+1;
		for(int j=i+1;j<=r;j++){
			if(st[j].price


你可能感兴趣的:(PAT)