贮油点问题(C++)
贮油点问题…..一道送命系列的递推…
描述 Description
一辆重型卡车欲穿过S公里的沙漠,卡车耗汽油为1升/公里,卡车总载油能力为W公升。显然卡车装一次油是过不了沙漠的。因此司机必须设法在沿途建立若干个贮油点,使卡车能顺利穿过沙漠。试问司机如怎样建立这些贮油点?每一贮油点应存储多少汽油,才能使卡车以消耗最少汽油的代价通过沙漠?
输入格式 Input Format
仅一行,读入整数S,W(S<=1000,W<=500)。
输出格式 Output Format
编程计算及打印建立的贮油点序号,各贮油点距沙漠边沿出发的距离以及存油量(输出到小数点后第二位)。格式
如下:
? 0 0.00 (dist) ××(oil)
? 1 × × (dist) ××(oil)
? 2 × × ××
? … …… ……
注意:输出除了编号外距离和存油量均占10位。Pascal语言中表达为: Oir:10:2 Dist:10:2。
样例输入 Sample Input
1000 500
样例输出 Sample Output
0 0.00 3881.36
1 22.43 3500.00
2 60.89 3000.00
3 106.35 2500.00
4 161.90 2000.00
5 233.33 1500.00
6 333.33 1000.00
7 500.00 500.00
我最开始连题都读不懂…..怎么可能会写……直到有一天一个dalao告诉我说我校oj有题解,于是就去读了题解写完的…..感谢那个撰写题解的dalao….
首先声明一下这个题的题意…..(看了dalao题解思路才懂):
车子想要穿过沙漠,但是储油点是自己建立的
比如样例1
0 0.00 3881.36
就是说,自己在起点建立一个有 3881.36L的油点
然后跑向 22.43 这个储油点,一共跑了17次,一共卸下了3500L的油,消耗了381.36L的油
然后把剩下的3500L的油继续运向下一个储油点……
也就是说,车子是边走边建立储油点的,车子离开的时候,每个储油点的油都被运到了下一个储油点,到最后车子离开沙漠,油全部用完,储油点空空如也。
然后就是题解了:
如果从起点出发顺推,则我们无法确定第一个贮油点的位置及贮油量,因此我们可以用倒推法来解决这个问题:先从终点出发倒推最后一个储油点的位置及储油量,然后再把最后一个储油点作为终点,倒推倒数第二个储油点的位置及储油量。
因为题目中要求找最少的耗油,也就是说,最后一个储油点的位置离终点的距离就是汽车一次能行驶的距离,这样就可以直接装满油走了。那么我们就可以确定了最后一个储油点的位置,就是总路程s减去汽车油箱大小w,存储的油就是w。
然后根据最后一个储油点向前推,因为要在当前储油点运送w的油,而中途汽车运油的时候,还会消耗油量,那么就需要w*2的油,而储油点距离当前储油点的距离就是汽车消耗w油所走的路程除以来回的次数。
注意,最后一个点也就是最开始的点需要特判,手动赋值。
PS:发现从后往前每次运油的来回次数都是从1开始每次+2,(因为每次多运了w油,所以多走一个来回)。
那么我们用ai[p]表示最后一个点的距离,bi[p]表示最后一个点的油量,x表示来回数
则有: ai[p-1]=ai[p]+w;
bi[p-1]=ai[p]-w/x;
这样我们就可以用循环来AC这道题了
代码如下:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
long long p=,l,x=,q=,t=;
double s,w,zb[],yl[],d=,cb[],cy[];//zb是逆推时存距离的,cb用来存储距离,方便后面倒着输出,yl存储逆推时的储油量,cy记录yl,同样为了方便倒着输出
int main(){
cin>>s>>w;
zb[]=s-w;
yl[]=w;
d=w;//d是储油点的距离
while(d!=) {//逆推得不到0,所以只要!=0就推就好了//自然是可以直接大于0的...这样下面那行<0的特判就不必要了...dalao可以尝试下,反正我失败了、。。。
q++;//q是循环的次数
x+=;
l=p;
yl[p+]=yl[p]+w;
zb[p+]=zb[p]-w/x;
d=zb[p];
if(d<){//但是会出现小于0的情况,这是我们直接结束循环即可
p--;
break;
}
cb[p]=zb[p];
cy[p]=yl[p];
p++;
}
cb[p+]=0.00;//最后一组距离为0.00的情况需要特判
cy[p+]=yl[p]+zb[p]*x;
for(int i=q;i>=;i--){
cout<<setiosflags(ios::fixed)<<setprecision();
cout<<t<<' '<<cb[i]<<' '<<cy[i]<<endl;
t++;//t表示储油点的序号,从0开始
}
return ;
}
PS:网上的贮油点问题大多没有完整的通俗易懂的代码……发出来造福群众……
PS:看代码AC就看代码AC了吧……反正对于敲程序的人没有任何益处,对我也没有任何坏处……
贮油点问题(C++)的更多相关文章
- 【a302】&&【9306】贮油点问题
Time Limit: 1 second Memory Limit: 2 MB 问题描述 一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升.显然卡车装 一次油是过 ...
- c语言-递推算法1
递推算法之一:倒推法 1.一般分析思路: if 求解初始条件F1 then begin { 倒推 } 由题意(或递推关系)确定最终结果Fn; 求出倒推关系式Fi-1 =G(Fi ); i=n; { 从 ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...
- utf-8 汉字对照表
之前从redis中取出一些数据,utf8 16进制编码,想转成字符,没有找到现成的转化工具,先用这个表直接查找对照吧. UTF8编码表大全Code code# Code (coded in UTF-8 ...
- ActiveMQ
前言 MQ--Message Queue,中文翻译为"消息队列",维基百科上的这样描述: 消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方 ...
- Windows操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- php 中文繁简体转换
<?php $testC = new TestC (); $testC->index (); class TestC { private $utf8_gb2312; private $ut ...
- js 简繁体字转换
有些项目需要用到简体和繁体两种字体,在js前台进行转换比较方便而且显示速度没有延时 是一个比较好的解决方案. var _isFT_CS = 0// 简体 var _isFT_CT = 1// 繁体 v ...
- Sort merge join、Nested loops、Hash join(三种连接类型)
目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed ...
随机推荐
- 魔法物品(magic.pas/c/cpp)
有两种类型的物品:普通物品和魔法物品.普通物品没有魔法属性,而魔法物品拥有一些魔法属性.每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值P.和鉴定后的价值P2(当然,P2总是大于P.) ...
- [Leetcode] Balanced binary tree平衡二叉树
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- [学习笔记]最小割之最小点权覆盖&&最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- Codeforces Round #328 (Div. 2) A
A. PawnChess time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- bzoj 4237 稻草人 CDQ
稻草人 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1433 Solved: 626[Submit][Status][Discuss] Descr ...
- 二进制转16进制JAVA代码
public class Binary2Hex { public static void main(String[] args) { String bString ="10101000&qu ...
- ContenOS 安装配置 rpm 版本 Jenkins
软件准备: jenkins-2.7.4-1.1.noarch.rpm java环境 安装jenkins: [root@localhost modules]# rpm -ih jenkins-2.7.4 ...
- 修复ios上第三方输入法弹出时输入键盘盖住网页没有进行相应滚动从而盖住表单输入框的问题
fixIME(); function fixIME(){ scroll_y = 100; // 如果键盘弹起后 网页window对象的卷起小于此值,说明没有自动卷起 单位:px timer = 50 ...
- HDU2571--命运---DP
http://acm.hdu.edu.cn/showproblem.php?pid=2571 #include "iostream" #include "cstdio&q ...
- [POJ2954&POJ1265]皮克定理的应用两例
皮克定理: 在一个多边形中.用I表示多边形内部的点数,E来表示多边形边上的点数,S表示多边形的面积. 满足:S:=I+E/2-1; 解决这一类题可能运用到的: 求E,一条边(x1,y1,x2,y2)上 ...