PAT A1070 Mooncake(同B1020)

PAT A1070 Mooncake(同B1020)

在这里插入图片描述

Sample Input:

3 200
180 150 100
7.5 7.2 4.5

Sample Output:

9.45
wordmeaning
crustsn.面包皮,wlke
inventoryn.详细目录,存货清单
  • 思路 1:
    用一个结构体数组存储每种月饼,输入时计算出单价(总价/库存),再按单价排序,每次都选择单价最高的拿(如果够拿,即市场需求不少于库存),拿完更新需求,直到需求比库存小了(else),就只拿需求的量,在这一过程中将结果(总售价)累加到res变量中

  • 坑点:
    “随后一行给出 N 个正数表示每种月饼的库存量” ,题中只说了正数所以不同月饼的库存和价格可以是浮点型

  • code 1:

#include<bits/stdc++.h>
using namespace std;
struct MoonCake{
	double piece;
	double sell;
	double store;
}mc[1010];
bool cmp(MoonCake a, MoonCake b){
	return a.piece > b.piece;
}
int main(){
	int n;
	double m;
	scanf("%d %lf", &n, &m);
	for(int i = 0; i < n; ++i){
		scanf("%lf", &mc[i].store);
	}
	for(int i = 0; i < n; ++i){
		scanf("%lf", &mc[i].sell);
		mc[i].piece = mc[i].sell / mc[i].store;	//求单价 
	}	
	sort(mc, mc + n, cmp);
	double result = 0.0;
	for(int i = 0; i < n; ++i){
		if(mc[i].store <= m){
		//如果mc[i]的库存<=市场需求 
			m -= mc[i].store;	//更新当前需求量 
			result += mc[i].sell;
		} 
		else{
		//如果库存比需求多了,只卖需求的量(并结束循环) 
			result += m * mc[i].piece;
			break;
		}
	}
	printf("%.2f\n", result);
	return 0;
} 	
  • T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct M{
	double price, num, value;	//Wrong1:正数 != 正整数 
}mooncake[maxn];

bool cmp(M a, M b){
	return a.price > b.price;
}
int main(){
	int n;
	double need;
	scanf("%d %lf", &n, &need);
	for(int i = 0; i < n; ++i){
		scanf("%lf", &mooncake[i].num);
	}
	for(int i = 0; i < n; ++i){
		scanf("%lf", &mooncake[i].value);
		mooncake[i].price = mooncake[i].value / mooncake[i].num;
	}
	sort(mooncake, mooncake+n, cmp);
	double sum = 0.0; 
	for(int i = 0; i < n && need > 0; ++i){
		double num = need > mooncake[i].num ? mooncake[i].num : need;
		sum += mooncake[i].price *  num;
		need -= num;
	}
	printf("%.2f", sum);
	return 0;
} 
  • T3 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct Mooncake
{
    double price, total_price, amount;
}mooncake[maxn];

bool cmp(Mooncake a, Mooncake b)
{
    return a.price > b.price;
}
int main()
{
    int n, d;
    scanf("%d %d", &n, &d);
    for(int i = 0; i < n; ++i)
    {
        scanf("%lf", &mooncake[i].amount);  //WRONG 1: 用int型样例2错误
    }
    for(int i = 0; i < n; ++i)
    {
        scanf("%lf", &mooncake[i].total_price);
        mooncake[i].price = mooncake[i].total_price / mooncake[i].amount;
    }
    sort(mooncake, mooncake+n, cmp);
    int idex = 0;
    double sum_price = 0;
    while(d > 0 && idex < n)   //WRONG 2:不加idex<n样例3会段错误
    {
        if(d > mooncake[idex].amount)
        {
            sum_price += mooncake[idex].total_price;
            d -= mooncake[idex].amount;
        }else
        {
            sum_price += mooncake[idex].price * d;
            break;
        }
        idex++;
    }
    printf("%.2f", sum_price);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您的代码有一个错误,在定义结构体数组时,数组的大小必须是常量,不能是变量n,因为在编译时无法确定n的值。您可以使用动态内存分配来解决这个问题。请参考以下修改建议: ```c #include<stdio.h> #include<stdlib.h> struct mooncake{ double number; double price; double value; }; void swap(struct mooncake a[],int i,int j) { struct mooncake t = a[i]; a[i] = a[j]; a[j] = t; } int p(struct mooncake a[],int m,int n){ struct mooncake x = a[m]; int i = m; for(int j = m + 1; j <= n; j++){ if(a[j].value >= x.value){ i++; swap(a, i, j); } } swap(a, m, i); return i; } void q(struct mooncake a[],int m,int n){ int r; if(m < n){ r = p(a, m, n); q(a, m, r-1); q(a, r+1, n); } } int main() { int n; double d, value; while(scanf("%d%lf", &n, &d) != EOF){ struct mooncake* m = (struct mooncake*)malloc(n * sizeof(struct mooncake)); for(int i = 0; i < n; i++){ scanf("%lf", &m[i].number); } for(int i = 0; i < n; i++){ scanf("%lf", &m[i].price); m[i].value = m[i].price / m[i].number; } q(m, 0, n-1); value = 0; for(int i = n - 1; i >= 0; i--){ if(d >= m[i].number){ value += m[i].price; d -= m[i].number; } else { value += d * m[i].value; break; } } printf("%.2lf\n", value); free(m); } return 0; } ``` 这里使用了动态内存分配,通过malloc函数分配结构体数组的内存空间,在程序结束时使用free函数释放内存。同时,在快速排序算法中,将原来的比较大小方式改为比较价值大小,以实现降序排序。在计算总价值时,从大到小依次考虑每种月饼的数量,如果需求量大于该种月饼的数量,则全部购买该种月饼,继续考虑下一种月饼;否则,按需求量购买该种月饼,并计算对应的总价值即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值