題目描述:
說小明的媽媽給了小明一定錢數,希望他儘可能多地買龍蝦。小明做了市場調查,將市場上的小龍蝦單價和總數放在一個名叫做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即保留了兩位小數。
此測試程序運行後的結果爲: