您的位置:首页 > 编程语言

第五届华为“创新杯”编程大赛初赛题目(第二场)

2014-05-06 22:13 344 查看
题目描述

电瓶车行到终点过程中有N个充电站,每个充电站的价格是不同的,每度电可运行的距离固定。请以最节省方式骑完全程。

在起始的时候每个电瓶车的电量是满的,此部分价格不算入总价格

输入

输入参数为电瓶车能够存储电量的大小,终点距起点的距离,每度电可运行的距离,充电站个数,充电站列表。

其中充电站列表包括该充电的每度价格和距起点的距离

充电站列表的结构

{

Int nPrize;//每度电单价

int nDist;//离出发点距离

}

注意,充电站的结构请按照字符串的方式进行解析

输出

输出:如果可以达到终点,则输出运行的距离和花费;如果不能运行到达终点,则输出可运行的最大距离和花费

样例输入

10 20 1 2 {1,5} {2,15}
样例输出

20 15

自己最开始的思路:

1.如果剩余电量能到达后面电力更便宜的一个站,就开过去;
2.如果1不符合,但是如果能够在该站加电,到达后面电力更便宜的一个站,就加电开过去,使得抵达时电力恰好用完;
3.如果1,2都不符合,就在这个站加满电,然后跑到下一个站。若能抵达终点,就直接到终点。

后来在写代码的时候感觉不对,主要是第3点,自己举了个反例,比如:

S(0)---X1(10,5)X2(11,7)-------->D(10)

其中X代表充电站,X(a,b)的a代表价格,b代表距离,而电车一次性充满电可以行使距离的60%(即:距离6),按照原来的算法,电车在X1处,符合条件3(即:如果1,2都不符合,就在这个站加满电,然后跑到下一个站。若能抵达终点,就直接到终点),此时在X1处加满了电(即加50%的电),但其实只需要在X1加40%的电即可。

因此加了判断,如果加满电行驶的距离能大于等于剩余的路程,就加恰好到达目的地的电量。

后来又仔细分析了下,感觉还是不对,例如

S(1)---X1(10,5)X2(11,6)X3(2,7)-------->D(10)

按照改进后的算法,应在X1处加40%的电量,然后直接开到终点。但最优的是:

在X1加10%的电(因此时电车剩余10%的电量,充10%后有20%的电量,恰好能行驶距离2),使之恰好到达X3,再在X3加30%的电,使之恰好到达终点。

因此,最优策略不能只考虑当前的加电站和后面一个加点站,因此感觉比较复杂,不知道有哪位大神帮忙解决下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 算法 创新杯