PAT 1020. 月饼<未完>

原题链接:http://pat.zju.edu.cn/contests/pat-b-practise/1020

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。

输入格式:

每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。

输出格式:

对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。

输入样例:
3 20
18 15 10
75 72 45
输出样例:
94.50
//使用list的排序算法
#include <stdio.h>
#include <list>
using namespace std;
const int N = 1000;
struct Cake
{
  int num;//库存
  int total_price;//总价
  double unit_price;//单价
};
bool cakeSort(Cake cake1, Cake cake2)
{
  return cake1.unit_price>cake2.unit_price;
}
int main()
{
  int n, m;//分别表示种类数及最大需求量
  list<Cake> cakes;
  int amount[N];
  double max_profit;
  while(scanf("%d %d", &n, &m)!=EOF)
  {
    for(int i=0; i<n; i++)
    {
      scanf("%d", &amount[i]);
    }
    for(int i=0; i<n; i++)
    {
      Cake cake;
      scanf("%d", &cake.total_price);
      cake.num = amount[i];
      cake.unit_price = (double)cake.total_price/cake.num;
      cakes.push_back(cake);
    }
    cakes.sort(cakeSort);
    max_profit = 0;
    while(!cakes.empty())
    {
      Cake cake = cakes.front();
      cakes.pop_front();
      if(cake.num>=m)
      {
        max_profit +=((double)cake.total_price*m/cake.num);
        break;
      }
      max_profit +=cake.total_price;
      m -= cake.num;
    }
    printf("%0.2f\n", max_profit);
    cakes.clear();
  }
  return 0;
}


无奈有一个点一直测试超时,考虑到没有必要对所有的数据都排序,所以改用下面的方法,冒泡排序,每次得到单价最大的月饼后就进行计算,满足市场需求量后即停止,但还是超时,以后再想办法。
#include <stdio.h>
const int N = 1000;
struct Cake
{
  int num;//库存
  int total_price;//总价
  double unit_price;//单价
};
int main()
{
  int n, m;//分别表示种类数及最大需求
  Cake cakes[N];
  double max_profit;
  while(scanf("%d %d", &n, &m)!=EOF)
  {
    for(int i=0; i<n; i++)
    {
      scanf("%d", &cakes[i].num);
    }
    for(int i=0; i<n; i++)
    {
      scanf("%d", &cakes[i].total_price);
      cakes[i].unit_price = (double)cakes[i].total_price/cakes[i].num;
    }
    int index = 0;
    max_profit = 0;
    bool sorted = false;
    for(int i=0; i<n; ++i)
    {
      if(!sorted)
      {
        sorted = true;
        for(int j=n-1; j>i; --j)
        {
          if(cakes[j].unit_price > cakes[j-1].unit_price)
          {
            Cake c = cakes[j];
            cakes[j] = cakes[j-1];
            cakes[j-1] = c;
            sorted = false;
          }
        }
      }
      if(cakes[i].num >= m) {
        max_profit +=((double)cakes[i].total_price*m/cakes[i].num);
        break;
      }
      else {
        max_profit +=cakes[i].total_price;
        m -= cakes[i].num;
      }
    }
    printf("%0.2f\n", max_profit);
  }
  return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值