/** * 一辆汽车加满油后可行驶n(例如n=100)公里。路途中有若干个加油站(例如加油站之间间隔d = [50,80,39,60,40,32], * 单位是公里)。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n<=5000) * 和k(k<=1000)个加油站位置。 */ public class C_Solution { /** * @param x 每个加油站的相隔距离 * @param n 汽车加满油的最大行驶距离 * @return */ public static int greedy(int x[], int n){ //sum是加油次数 //s是汽车经过加油站没有加油的情况下的行驶距离 int sum = 0, k = x.length, s = 0; //一开始满油, //某两个加油站之间距离大于汽车满油最大行驶距离,则无法到达目的地。 for (int j = 0; j < k; j++) { if (x[j] > n) { System.out.println("无法到达目的地!!!"); return -1; } } for (int i = 0; i < k; i++) { s += x[i]; if (s > n) { sum++; s = x[i]; } } return sum; } public static void main(String[] args) { Scanner read = new Scanner(System.in); System.out.println("汽车满油情况下的最大行驶旅程:"); // maximum traveling int max = read.nextInt(); System.out.println("加油站个数:"); int gNum = read.nextInt(); //number of gas stations int space[] = new int[gNum]; System.out.println("每个加油站的相隔距离:"); for (int i = 0; i < gNum; i++) { space[i] = read.nextInt(); } int res = greedy(space, max); System.out.println("要加油" + res + "次。"); } } //测试贪心算法 class AA { public static void main(String[] args) { int max = 20; int gNum = 5; int[] space = {20, 15, 5, 18, 10}; for (int i = 0; i < 5; i++) { if (max < space[i]) { System.out.println("No solution."); return; } } int gTimes = 0; int travel = 0; for (int i = 0; i < 5; i++) { travel += space[i]; if (max < travel) { gTimes++; travel = space[i]; } } System.out.println("times: " + gTimes); } }
贪心算法之汽车加油问题
最新推荐文章于 2024-03-26 19:27:10 发布