PAT甲级1070 Mooncake (25分)|C++实现

一、题目描述

原题链接
在这里插入图片描述

Input Specification:

在这里插入图片描述

​​Output Specification:

在这里插入图片描述

Sample Input:

3 200
180 150 100
7.5 7.2 4.5

Sample Output:

9.45

二、解题思路

贪心思想,要得到最大利益,那我们就一直卖单价最高的月饼,卖完之后再买第二高的月饼,以此类推。我们可以用一个结构体表示月饼,里面包含单价、总价和数量,单价可以由总价除以数量得出,将结构体数组按单价从大到小排序,然后按顺序遍历,数量到达题目所给数字时,退出循环,输出答案即可。

三、AC代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1010;
struct Mooncake
{
    
    
  double single, price;
	double num;
}mooncake[maxn];
bool cmp(Mooncake a, Mooncake b)
{
    
    return a.single > b.single;}
int main()
{
    
    
  int N, D, cnt = 0;
  double profit = 0;
  scanf("%d%d", &N, &D);
  for(int i=0; i<N; i++)
    scanf("%lf", &mooncake[i].num);
  for(int i=0; i<N; i++)
  {
    
    
    scanf("%lf", &mooncake[i].price);
    mooncake[i].single = mooncake[i].price/mooncake[i].num;
  }
  sort(mooncake, mooncake+N, cmp);
  int now = 0;
  while(cnt < D && now < N)
  {
    
    
    if(mooncake[now].num + cnt <= D)
    {
    
    
      cnt += mooncake[now].num;
      profit += mooncake[now].price;
    }
    else
    {
    
    
      profit += mooncake[now].single * (D-cnt);
      cnt = D;
    }
    now++;
  }
  printf("%0.2f", profit);
  return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42393947/article/details/108707623