加油站

算法优化专题F POJ - 2431

此生再无相见时 提交于 2020-03-03 16:22:43
【题目大意】 奶牛的车的油箱破了,每开一个单位距离会花费一单位体积油,奶牛距离城镇L个单位长度。在奶牛到城镇的路途中有n个加油站,第i个加油站距离城镇xi,能加yi的油。如果奶牛能到达城镇,则输出奶牛最少需要的加多少个加油站里的油。如果奶牛不能达到城镇输出-1. 【解题思路】 贪心 让奶牛用光油能到达位置x,那么此时要补充油只能从位置x(包括x)前面的加油站加油,很显然要选最多油的加油站。用大根堆维护加油站油量即可。 【代码】 # include <cstdio> # include <queue> # include <algorithm> using namespace std ; priority_queue < int > Q ; struct data { int x , y ; } a [ 10101 ] ; bool cmp ( data x , data y ) { return ( x . x < y . x ) ; } int main ( ) { int n , L , P ; scanf ( "%d" , & n ) ; for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%d%d" , & a [ i ] . x , & a [ i ] . y ) ; scanf ( "%d%d" , & L , & P ) ; for

PTA:7-111 汽车加油问题 (20分)

余生颓废 提交于 2020-01-22 01:25:51
7-111 汽车加油问题 (20分) 题目来源:王晓东《算法设计与分析》 一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。 输入格式: 第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。 输出格式: 输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。 输入样例: 7 7 1 2 3 4 5 1 6 6 输出样例: 4 具体解析如代码所示: # include <bits/stdc++.h> using namespace std ; int a [ 1100 ] ; int main ( ) { int n , k , t ; cin >> n >> k ; for ( int i = 0 ; i <= k ; i ++ ) { cin >> a [ i ] ; } int m = n , cnt = 0 , flag = 0 ; for ( int i = 1 ; i < k ; i ++ ) { if ( n < a [ i ] || n < a [ i + 1 ] )

第四章作业

大兔子大兔子 提交于 2019-12-23 00:14:15
1.你对贪心算法的理解 贪心算法就是在解决问题时总是选择当前最优的解,寻找局部最优的情况,并不从整体上考虑最优解。 2.请说明汽车加油问题的贪心选择性质 问题描述:汽车加油问题 (20 分) 题目来源:王晓东《算法设计与分析》 一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。 输入格式: 第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。 输出格式: 输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。 输入样例: 7 7 1 2 3 4 5 1 6 6 输出样例: 4 用贪心算法解决本题目是最初的思路,然后根据题目意思,首先做的第一项工作是将“No Solution!”的情况排除出来, 也就是两个油站之间的距离要大于汽车油箱容量的情况,之后用贪心算法的思想,计算出油箱满的情况下尽可能多地经过多个油站; 然后通过以下算法步骤解决算法: for(int i = 0,s = 0;i <= k;i++) { s += d[i]; if(s > n) { num++; s = d[i]

校oj-1019 第三届程序设计大赛 汽车加油

╄→гoц情女王★ 提交于 2019-12-21 20:24:58
第三届程序设计大赛 汽车加油 Time Limit:1000MS Memory Limit:65536K Total Submit:1510 Accepted:540 Description 一辆汽车加满油后可行驶N公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。 Input 第一行有2 个正整数N和K(1 <= N <= 100,1 <= K< = 100),表示汽车加满油后可行驶N公里,且旅途中有K个加油站。接下来的1 行中,有K+1 个整数,表示第K个加油站与第K-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第K+1 个整数表示第K个加油站与目的地的距离。 Output 将编程计算出的最少加油次数输出。如果无法到达目的地,则输出 No Solution(注意:No和Solution之间有一个空格) Sample Input 8 8 3 2 3 6 5 4 2 7 2 Sample Output 5 Source #include <iostream> #include <cstdio> using namespace std; int cnt; int main() { int N,K,flag =0; int a[100005]; scanf("%d%d",&N,&K); for(int i=0;i<=K;i

leetcode--134加油站

放肆的年华 提交于 2019-12-16 17:33:15
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 说明: 如果题目有解,该答案即为唯一答案。 输入数组均为非空数组,且长度相同。 输入数组中的元素均为非负数。 示例 1: 输入: gas = [1,2,3,4,5] cost = [3,4,5,1,2] 输出: 3 解释: 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 因此,3 可为起始索引。 示例 2: 输入: gas = [2,3,4] cost = [3,4,3] 输出: -1 解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。 我们从 2

134. 加油站

故事扮演 提交于 2019-12-09 19:26:36
134. 加油站 在一条环路上有N个加油站,其中第i个加油站有汽油gas[i]升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 说明: 如果题目有解,该答案即为唯一答案。 输入数组均为非空数组,且长度相同。 输入数组中的元素均为非负数。 示例1: 输入: gas = [1,2,3,4,5] cost = [3,4,5,1,2] 输出: 3 解释: 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 因此,3 可为起始索引。 示例 2: 输入: gas = [2,3,4] cost = [3,4,3] 输出: -1 解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。 我们从 2

算法第四章作业

我的梦境 提交于 2019-12-05 12:35:55
1.对贪心算法的理解   贪心算法是一种特殊的动态规划,只有当局部最优跟全局最优解一致的时候,贪心法才能给出正确的解,如何找到适合的贪心法是解题的关键。 2.请说明汽车加油问题的贪心选择性质 题目来源:王晓东《算法设计与分析》 一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。 输入格式: 第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。 输出格式: 输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。 输入样例:   7 7   1 2 3 4 5 1 6 6 输出样例:   4 题目要求得到最少的加油次数,所以我们可以每次经过加油站时判断剩余油量是否足够汽车行驶到下一加油站,不行则加油,如果加油后依旧不能让汽车到达则判定无法到达目的地。 3.说明在本章学习过程中遇到的问题及结对编程的情况   问题时不能第一时间找出适当的贪心法,结对编程情况是挺好的。 来源: https://www.cnblogs.com/yingni/p/11925132.html

算法第四章作业

不问归期 提交于 2019-12-05 04:17:15
你对贪心算法的理解 : 贪心算法就是对当前而言做出最好的选择,即使不能得到整体最优解,但其最终结果却是最优解的很好的近似解。 请说明汽车加油问题的贪心选择性质 : 汽车行驶到下一个加油站之前,判断当前所剩的汽油量是否能支撑汽车到达下一个加油站。如果足够到达下个加油站就不在此加油站停靠,如果无法到达下个加油站就在此加油站停靠加油。 请说明在本章学习过程中遇到的问题及结对编程的情况 : 上周结对编程请假了,辛苦我的小伙伴了。 来源: https://www.cnblogs.com/llr-www9173/p/11905070.html

算法第四章作业

五迷三道 提交于 2019-12-05 03:48:51
一、你对贪心算法的理解   贪心算法就是先在所有数据中先选出当前最优解,然后在剩余数据中选出当前最优解,然后以此迭代下去,直到得到答案。   但这里存在一个问题,就是之前的选择可能会影响后面的选择,所以最后的到的答案并不一定能满足全局最优。   虽然每一步都是局部最优,但也只是经过上一步选择后在约束条件内的选择而已。 二、请说明汽车加油问题的贪心选择性质   贪心策略:计算到下一个加油站够不够油,不够就在当前加油站加油,够就开往下一个加油站,如果在当前加油站加了油还是不能到下一个加油站,就输出No Solution        此选择的意义就是使车不够油时在加油,使汽车在到达加油站加油时剩余的量最少,使它每次加油行驶的距离最远减少了加油的次数。 三、请说明在本章学习过程中遇到的问题及结对编程的情况   实践题第三题卡住了,但是大佬直接一波优先队列给秒了。看着他打题,我又学到了很多新的操作。总之就是非常的棒,希望各位教学相长吧 来源: https://www.cnblogs.com/hxyawsl/p/11903551.html

汽车加油

心不动则不痛 提交于 2019-12-02 12:46:12
内容: 一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。 分析: 第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。输出编程计算出的最少加油次数。如果无法到达目的地,则输出”No Solution”。 代码: //汽车加油 #include using namespace std; int main() { int n, k; int* station; cout << “请输入加满油后汽车的最大行驶距离以及加油站的个数:” <<endl ; cin >> n >> k; station = new int[k + 1]; cout << “请依次输入各相邻加油站之间的距离:” << endl; for (int i = 0; i <= k; i++) cin >> station[i]; int s = 0; int number = 0; //number加油的次数 s = station[0]; //加满油后希望行驶的距离 for (int i