最多买多少只龙虾

来源:互联网 发布:泉州会计网络继续教育 编辑:程序博客网 时间:2024/04/28 05:32

题目描述:
说小明的妈妈给了小明一定钱数,希望他尽可能多地买龙虾。小明做了市场调查,将市场上的小龙虾单价和总数放在一个名叫做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即保留了两位小数。
此测试程序运行后的结果为:
这里写图片描述

0 0
原创粉丝点击