暴力的达瓦里氏 2023-10-15 19:49 采纳率: 100%
浏览 15
已结题

求题代码 我一直得80分

题目描述
马上又到了一年一度的新年联欢,小明作为班里的班长,负责组织策划新年联欢活动,他决定采购一些奖品奖励积极参与每个活动项目的同学。为了激励更多的人参与活动,需要采购的奖品数目越多越好。

班费中可支出的钱数为

m 元,现给定商店中

n 种可作为奖品的物品的价格和库存数量,怎样才能购得最多的物品数?

输入格式
输入共有

+
1
n+1 行:

第一行包含两个正整数 m(1<m≤10000)和n(1≤n≤100),表示可支出的费用为m元和可供购买的物品有n种。

接下来的n行,每行包含两个数(由一个空格分隔),分别表示一种物品的单价ai和库存数量bi。其中,ai和bi均不会超过10000。

输出格式
输出仅包含一个整数,表示最多可以购买的物品数量。

样例 #1
样例输入 #1
500 6
100 3
20 15
50 10
35 5
5 6
60 2
样例输出 #1
25
提示
【样例解释】

价格为
5
5 的可以买
6
6 个,价格为
2
0
20 的可以买
1
5
15 个,价格为
3
5
35 的可以买
4
4 个,总共买了
2
5
25 件奖品。
我的代码:

#include <bits/stdc++.h>//万能头
#define ll long long//给 long long 起个别名叫ll 
using namespace std;
struct goods{//结构体 
    int price;//单价 
    int number;//数量 
}g[100+7];//定义数组 
bool cmp(goods g1,goods g2){
    return g1.price<=g2.price;//按单价升序排 
}
int main(){
    int money,number;//定义可用班费,商品种类数 
    ll sum=0,goods_number=0;//当前总钱数,当前总个数 
    cin>>money>>number;//输入 可用班费,商品种类数 
    for(int i=0;i<number;i++){
        cin>>g[i].price>>g[i].number;//输入 商品单价,商品数量 
    }
    sort(g,g+number,cmp);//升序 
    for(int i=0;i<number;i++){
        for(int j=0;j<=g[i].number;j++){
            if(j!=0){//特判 
                sum+=g[i].price;//累加 
                goods_number++;
            } 
            if(sum>money){//当前总钱数多了 
                cout<<goods_number-1;//输出当前商品总个数-1 
                return 0;//返回 
            }else if(sum==money){//当前总数刚刚好 
                cout<<goods_number;//输出当前商品总个数 
                return 0;//返回 
            }
        }
    }
}

求回复!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-15 22:21
    关注

    【以下回答由 GPT 生成】

    优化方案

    1. 题目描述,输入输出格式,样例解释

    根据题目描述,我们需要输入一个可用的班费金额 money 和可供购买的物品种类数 number。接下来的 number 行中,每行包含两个数,分别表示一种物品的单价 price 和库存数量 amount。我们的目标是确定最多可以购买的物品数量,并输出该数量。

    下面是示例输入和输出:

    输入:

    500 6
    100 3
    20 15
    50 10
    35 5
    5 6
    60 2
    

    输出:

    25
    

    样例解释: 价格为 5 的物品共有 6 个,价格为 20 的物品共有 15 个,价格为 35 的物品共有 4 个,总共可以购买 25 件奖品。

    2. 代码优化

    优化思路:

    1. 首先,我们可以使用 vector 容器来代替数组 g,这样可以省去指定数组长度的麻烦。
    2. 我们不需要使用 bits/stdc++.h 这个万能包括所有标准库的头文件,只需要包括需要使用的标准库头文件即可。
    3. 由于题目要求输出的是最多可以购买的物品数量,所以可以将 goods_number 的初始化值设置为 0,然后每次购买物品时再进行自增。
    4. 在内层的循环中,我们不需要特判 j != 0,因为当 j=0 时,说明这种物品的数量为 0,不会进入循环体内,所以没有必要进行特判。
    5. 当当前总钱数 sum 大于可用班费 money 时,可以直接输出当前购买的物品数量 goods_number-1,然后结束程序。
    6. 最后,不要忘记在循环结束后输出最终的购买物品数量 goods_number

    下面是优化后的代码:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    struct Goods {
        int price;  // 单价
        int amount; // 数量
    };
    
    bool cmp(Goods g1, Goods g2) {
        return g1.price <= g2.price; // 按照单价升序排序
    }
    
    int main() {
        int money, number; // 可用班费和商品种类数
        int sum = 0, goods_number = 0; // 当前总钱数和当前购买的总物品数
        cin >> money >> number; // 输入可用班费和商品种类数
    
        vector<Goods> goods(number); // 使用vector代替数组,并指定大小为number
    
        for(int i=0; i<number; i++) {
            cin >> goods[i].price >> goods[i].amount; // 输入商品单价和库存数量
        }
    
        sort(goods.begin(), goods.end(), cmp); // 对商品按照单价进行升序排序
    
        for(int i=0; i<number; i++) {
            for(int j=0; j<=goods[i].amount; j++) {
                sum += goods[i].price; // 累加当前商品的价格
                goods_number++; // 增加购买的物品数量
    
                if(sum > money) { // 当前总钱数超过可用班费时,输出结果并结束程序
                    cout << goods_number-1;
                    return 0;
                }
            }
        }
    
        cout << goods_number; // 输出购买的物品数量
        return 0;
    }
    

    优化后的代码相较于原始代码只做了一些简单的修改和优化,没有改变算法逻辑和实现。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月25日
  • 已采纳回答 10月17日
  • 创建了问题 10月15日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据