当前位置: 首页 > news >正文

03.购物单

题目:购物单

题目描述

小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。

这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。
小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。

取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。
你的任务是计算出,小明最少需要取多少现金。


购物单

以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了:

标价(元)折扣
180.9088折
10.2565折
56.149折
104.659折
100.3088折
297.15半价
26.7565折
130.62半价
240.2858折
270.628折
115.8788折
247.3495折
73.219折
101.00半价
79.54半价
278.447折
199.26半价
12.979折
166.3078折
125.5058折
84.989折
113.3568折
166.57半价
42.569折
81.9095折
131.788折
255.8978折
109.179折
146.6968折
139.3365折
141.1678折
154.748折
59.428折
85.4468折
293.7088折
261.7965折
11.3088折
268.2758折
128.2988折
251.038折
208.3975折
128.8875折
62.069折
225.8775折
12.8975折
34.2875折
62.1658折
129.12半价
218.37半价
289.698折

说明
  1. 折扣规则

    • 例如“88折”表示按标价的 88% 计算;
    • “8折”表示按标价的 80% 计算;
    • 特别地,“半价”表示按标价的 50% 计算。
  2. 取款机限制

    • 取款机只能提供 100元面额的纸币
    • 小明希望尽可能少取些现金,但必须保证金额足够支付购物单上的所有商品。
  3. 输出要求

    • 提交的答案是一个整数,单位是元;
    • 答案的结尾必然是 00,例如 4300

解题思路

  1. 理解问题

    • 每个商品的实际支付金额 = 标价 × 折扣率;
    • 遍历购物单中的所有商品,累加每个商品的实际支付金额,得到总金额;
    • 将总金额向上取整到最近的 100 的倍数,以满足取款机的限制。
  2. 核心步骤

    • 计算实际支付金额
      • 遍历购物单中的每个商品,使用公式 标价 × 折扣率 计算每个商品的实际支付金额;
      • 将所有商品的实际支付金额累加起来,得到总金额。
    • 向上取整到 100 的倍数
      • 使用数学函数 ceil() 将总金额除以 100 后向上取整;
      • 再乘以 100,确保结果是 100 的倍数。
  3. 注意事项

    • 折扣率以小数形式表示,例如“88折”对应 0.88,“半价”对应 0.50
    • 最终结果必须是 100 的倍数,且不能小于总金额。

代码实现

以下是完整的 C++ 实现代码,并附有详细注释:

#include <iostream>  // 引入输入输出流库
#include <cmath>     // 引入数学库,用于向上取整函数 ceil()
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时加 std::

int main() {
    // 定义一个数组,存储每个商品的标价和折扣率
    // 每个商品用 pair<double, double> 表示,第一个值是标价,第二个值是折扣率
    const pair<double, double> items[] = {
        {180.90, 0.88}, {10.25, 0.65}, {56.14, 0.90}, {104.65, 0.90},
        {100.30, 0.88}, {297.15, 0.50}, {26.75, 0.65}, {130.62, 0.50},
        {240.28, 0.58}, {270.62, 0.80}, {115.87, 0.88}, {247.34, 0.95},
        {73.21, 0.90}, {101.00, 0.50}, {79.54, 0.50}, {278.44, 0.70},
        {199.26, 0.50}, {12.97, 0.90}, {166.30, 0.78}, {125.50, 0.58},
        {84.98, 0.90}, {113.35, 0.68}, {166.57, 0.50}, {42.56, 0.90},
        {81.90, 0.95}, {131.78, 0.80}, {255.89, 0.78}, {109.17, 0.90},
        {146.69, 0.68}, {139.33, 0.65}, {141.16, 0.78}, {154.74, 0.80},
        {59.42, 0.80}, {85.44, 0.68}, {293.70, 0.88}, {261.79, 0.65},
        {11.30, 0.88}, {268.27, 0.58}, {128.29, 0.88}, {251.03, 0.80},
        {208.39, 0.75}, {128.88, 0.75}, {62.06, 0.90}, {225.87, 0.75},
        {12.89, 0.75}, {34.28, 0.75}, {62.16, 0.58}, {129.12, 0.50},
        {218.37, 0.50}, {289.69, 0.80}
    };

    double total = 0; // 初始化总金额为 0

    // 遍历购物单中的每个商品
    for (const auto& item : items) {
        // 计算每个商品的实际支付金额:标价 × 折扣率
        total += item.first * item.second;
    }

    // 将总金额向上取整到最近的 100 的倍数
    // ceil(total / 100) 将总金额除以 100 后向上取整
    // 再乘以 100 得到最终结果
    cout << int(ceil(total / 100) * 100) << endl;

    return 0; // 程序正常结束
}

代码解释

  1. 数据结构

    • 使用 pair<double, double> 存储每个商品的标价和折扣率。
    • 第一个值(item.first)表示标价,第二个值(item.second)表示折扣率。
  2. 核心逻辑

    • 遍历购物单中的每个商品,计算其实际支付金额并累加到 total 中。
    • 使用 ceil() 函数将总金额向上取整到最近的 100 的倍数。
  3. 输出结果

    • 输出结果是一个整数,且必然是 100 的倍数。

运行结果

5200

简单版

#include <iostream>
#include <vector>

using namespace std;

   
    
int main()
{
    vector<double> prices = {180.90, 10.25, 56.14, 104.65, 100.30, 297.15, 26.75, 130.62, 240.28, 270.62, 115.87, 247.34, 73.21, 101.00, 79.54, 278.44, 199.26, 12.97, 166.30, 125.50, 84.98, 113.35, 166.57, 42.56, 81.90, 131.78, 255.89, 109.17, 146.69, 139.33, 141.16, 154.74, 59.42, 85.44, 293.70, 261.79, 11.30, 268.27, 128.29, 251.03, 208.39, 128.88, 62.06, 225.87, 12.89, 34.28, 62.16, 129.12, 218.37, 289.69};

    vector<double> discounts = {0.88, 0.65, 0.90, 0.90, 0.88, 0.50, 0.65, 0.50, 0.58, 0.80, 0.88, 0.95, 0.90, 0.50, 0.50, 0.70, 0.50, 0.90, 0.78, 0.58, 0.90, 0.68, 0.50, 0.90, 0.95, 0.80, 0.78, 0.90, 0.68, 0.65, 0.78, 0.80, 0.80, 0.68, 0.88, 0.65, 0.88, 0.58, 0.88, 0.80, 0.75, 0.75, 0.90, 0.75, 0.75, 0.75, 0.58, 0.50, 0.50, 0.80};

    double total = 0;
    for (int i = 0; i < prices.size(); ++i)
    {
        total += prices[i] * discounts[i];
    }

    if(total - (int(total / 100) * 100 ) > 0)
    {
        total = (int(total / 100) + 1) * 100;
    }

    cout << int(total) << endl;


   return 0;
}



相关文章:

  • IO进程思维导图和练习题
  • 防火墙虚拟系统
  • DeepSeek:大模型领域的创新力量
  • 自学嵌入式第27天------TCP和UDP,URL爬虫
  • 物联网感应层数据采集器实现协议转换 数据格式化
  • 在日常生活、工作中deepseek能帮我们解决哪些问题
  • 【JavaScript—前端快速入门】JavaScript 对象与函数
  • 计算机常用单词
  • 需求管理工具选型指南:Jama Connect +Jira vs Word/Excel+Jira
  • 网络安全检查漏洞内容回复 网络安全的漏洞
  • ArcGIS操作:13 生成最小外接矩阵
  • 基于STM32的环境监测系统(自制蓝牙APP)
  • Lua脚本使用教学指南:与Spring Boot项目集成示例
  • 动态内存分配
  • 网络编程——http
  • Linux网络 NAT、代理服务、内网穿透
  • 25年第四本【认知觉醒】
  • pnpm,npm,yarn到底有啥区别?
  • 基于 HTML、CSS 与 JavaScript 的计时器
  • LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)
  • 做影视网站关停/免费推广途径
  • wordpress 评论倒叙/长沙seo培训班
  • 公司网站建设小江/alexa
  • WordPress可以做政府网站吗/关键词组合工具
  • 办公室装修风格图/公司网站seo公司
  • 做移动网站建设/免费制作网站的软件