汽車加油問題 SDUT OJ 貪心演算法

Summer丶snow發表於2020-11-26

汽車加油問題

Description

一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計一個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生一個最優解。
對於給定的n和k個加油站位置,計算最少加油次數。

Input

輸入資料的第一行有2 個正整數n和k(n≤5000,k≤1000),表示汽車加滿油後可行駛n公里,且旅途中有k個加油站。接下來的1 行中,有k+1 個整數,表示第k個加油站與第k-1 個加油站之間的距離。第0 個加油站表示出發地,汽車已加滿油。第k+1 個加油站表示目的地。

Output

將計算出的最少加油次數輸出。如果無法到達目的地,則輸出“No Solution!”。

Sample

Input 

7 7
1 2 3 4 5 1 6 6

Output 

4

解題思路:

本題利用貪心演算法,
在當前地點的油量若能夠到達下一加油站,則跳到下一個加油站,
若不能,則在當前地點加滿油,再跳到下一加油站,
每一個 當前地點 都可以當成一個全新的出發點。

#include <iostream>

using namespace std;
/***
本題利用貪心演算法,
在當前地點的油量若能夠到達下一加油站,則跳到下一個加油站,
若不能,則在當前地點加滿油,再跳到下一加油站,
每一個 當前地點 都可以當成一個全新的出發點
***/

int len[1005];///記錄第k個加油站與第k-1個加油站之間的距離
int main()
{
    int n, k;///汽車加滿油後可行駛n公里,且旅途中有k個加油站
    cin >> n >> k;
    for(int i = 0; i < k+1; i++)/// 0 到 k 共 k+1 個數,
    ///表示第k個加油站與第k-1個加油站之間的距離,
    ///第0個加油站表示出發地,第k+1個加油站表示目的地
    ///len[0]表示 第一個加油站 到 第0個加油站(出發地)的距離
    ///len[k]表示 第k+1個加油站(目的地) 到 第k個加油站的距離(最後一個加油站)
    {
        cin >> len[i];
    }
    int residual = n;///汽車剩餘油量,從第0個加油站出發後初始為n
    int count = 0;///加油次數
    int flag = 1;///標記汽車是否能夠到達目的地,能到達置1,不能到達置0
    for(int i = 0; i < k+1; i++)
    {
        if(n < len[i])
        {///如果滿油的車也不能到達下一加油站,則無法到達目的地
            flag = 0;
            break;
        }
        if(residual > len[i])
        {///如果剩餘的油量能夠到達下一個加油站,則跳到下一個加油站
            residual -= len[i];
        }
        else
        {///如果剩餘油量不能到達下一加油站,則先加滿油再到達下一加油站
            residual = n;
            residual -= len[i];
            count++;///加油次數加1
        }
    }
    ///如果結束迴圈後flag仍等於1,說明車輛順利到達目的地,否則無法到達目的地
    if(flag)  cout << count << endl;
    else  cout << "No Solution!" << endl;
    return 0;
}

 

相關文章