贪心算法之汽车加油问题

/**
 * 一辆汽车加满油后可行驶n(例如n=100)公里。路途中有若干个加油站(例如加油站之间间隔d = [50,80,39,60,40,32] * 单位是公里)。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。对于给定的nn<=5000 * kk<=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);
    }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值