最多買多少隻龍蝦

題目描述:
說小明的媽媽給了小明一定錢數,希望他儘可能多地買龍蝦。小明做了市場調查,將市場上的小龍蝦單價和總數放在一個名叫做data_type的數據結構中,你能幫幫小明計算出這筆錢能最多買多少隻龍蝦嗎?
定義一個float getAns(int money, vector &Data)函數,返回值爲龍蝦個數,結果保留兩位小數。其中Data數組爲小明做的市場調查結果。注意:若要對Data數據進行排序,不能使用STL的sort()函數。

# include <iostream>
# include <vector>

using namespace std;

typedef struct Data 
{
    int price;
    int num;
} data_type;

float getAns( int money, vector<data_type> &Data);
void sortData(vector<data_type> &Data);
void printData(vector<data_type> &Data);

void createStore(vector<data_type> &Data)
{
    data_type stores[10] = {    {2, 9},
                                {3, 8},
                                {2, 7},
                                {3, 10},
                                {1, 3},
                                {0, 2},
                                {18, 1},
                                {3, 3},
                                {8, 9},
                                {3, 10}
    };
    for (int i = 0; i < 10; ++i)
    {
        Data.push_back(stores[i]);
    }
}

void sortData(vector<data_type> &Data)
{
    if (Data.size() <= 0)
        return;
    for (unsigned int i = 0; i < Data.size() - 1; ++i)
    {
        for (unsigned int j = 0; j < Data.size() - i - 1; ++j)
        {
            if (Data[j].price > Data[j + 1].price)
            {
                swap(Data[j], Data[j+1]);
            }
        }
    }
}

void printData(vector<data_type> &Data)
{
    for (unsigned int i = 0; i < Data.size(); ++i)
    {
        cout << Data[i].price << ", " << Data[i].num << endl;
    }
}

float getAns( int money, vector<data_type> &Data)
{
    if (money <= 0|| Data.size() <= 0)
        return 0.0;
    sortData(Data);
    int totalMoney = 0;
    int leftMoney = 0;
    int finalMoney = 0;
    int cnt = 0;
    float finalNum = 0.0;
    for (unsigned int i = 0; i < Data.size(); ++i)
    {
        if (totalMoney < money)
        {
            for (unsigned int j = 0; j < Data[i].num; ++j)
            {
                totalMoney += Data[i].price;
                finalMoney = Data[i].price;
                cnt ++;
                if (totalMoney >= money)
                    break;
            }
            if (totalMoney >= money)
                break;
        }
        if (totalMoney >= money)
            break;
    }
    if (totalMoney > money)
    {
        cnt --;
        totalMoney = totalMoney - finalMoney;
        leftMoney = money - totalMoney;
        int temp;
        temp = (int) (leftMoney * 100 * (1.0) / finalMoney);
        finalNum = temp/100.0 + cnt;
        return finalNum;
    }
    else
    {
        return cnt;
    }
}

int main(void)
{
    vector<data_type> Data;
    createStore(Data);
    cout << "ans is: " << getAns(42, Data) << endl;
    return 0;
}

做法是先將Data數據按單價從低到高排序,從低到高取小龍蝦,每取一個,記錄總價格之和,若總價之和大於給予的錢數,退出循環,然後算剩餘的錢數還能買零點幾隻龍蝦,最後龍蝦個數加上這個小數就是總龍蝦個數。
取小數點後兩位的做法是:先將小數擴大100倍後取整數,再將這個整數除以100.0即保留了兩位小數。
此測試程序運行後的結果爲:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章