1. 程式人生 > >實現汽車加油問題

實現汽車加油問題

一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計一個有效演算法,指出應
在哪些加油站停靠加油,使沿途加油次數最少。對於給定的n(n <= 5000)和k(k <= 1000)個加油站位置,程式設計計算最少加油次數。並證明演算法能產生一個最優解。
要求:
輸入:第一行有2個正整數n和k,表示汽車加滿油後可行駛n公里,且旅途中有k個加油站。接下來的1 行中,有k+1 個整數,表示第k個加油站與第k-1 個加油站之間的距離。第0 個加油站表示出發地,汽車已加滿油。第k+1 個加油站表示目的地。
輸出:輸出程式設計計算出的最少加油次數。如果無法到達目的地,則輸出”NoSolution”。

思路:根據貪心演算法的選擇性質為了要使加油次數最少就會選擇離加滿油的點遠一點的加油站加油。要使加油次數最少,應在每一次汽車中剩下的油不能再行駛到下一站的時候在該站加油。每一次加滿油之後與起點具有相同條件,可以看做一個全新的起點。

#include <iostream>
#include <vector>
using namespace std;

int greedy(vector<int> x, int n)
{
    int j, i, s, sum = 0, k = x.size();
    for(j = 0; j < k; ++j)
    if(x[j] > n){
        cout<<"No Solution"<<endl;
        return -1;
    }
    for(i = 0,s = 0; i < k; ++i){
        s += x[i];
        if(s > n)
            sum++, s = x[i];
    }
    return sum;
}

int main(){
   int n, k;
   cin >> n >> k;
   vector<int> x(k+1);
   for(int i = 0; i < x.size(); i++)
    cin >> x[i];
   int z = greedy(x, n);
   if(z != -1)
   cout << z <<endl;
   return 0;
}

輸入示例: