AI刷题-蛋糕工厂产能规划、优质章节的连续选择

news2025/2/20 12:43:03

挑两个简单的写写

目录

一、蛋糕工厂产能规划

问题描述

输入格式

输出格式

解题思路: 

问题理解

数据结构选择

算法步骤

关键点

最终代码:

运行结果:​编辑 

二、优质章节的连续选择 

问题描述

输入格式

输出格式

解题思路:

问题理解

数据结构选择

算法步骤

最终代码:

运行结果: 

 

 

 


一、蛋糕工厂产能规划

问题描述

小明开了一家蛋糕工厂,目前工厂里面有 m 台机器和 w 个工人,每天可以生产的蛋糕数量是 m * w。有一天他接到了一个订单,需要生产 n 个蛋糕,客户希望能够尽快的一次性交付,但是他算不清楚需要多少天才能生产完,请你帮帮小明。(提示:为了提升产能,每天可以用蛋糕购买额外的机器或者工人,每台机器或者每个工人,需要花费 p 个蛋糕。)

为了方便理解,我们举个例子:假如最开始小明的工厂只有 m = 1 台机器和 w = 2 个工人,每次扩大产能需要的花费是 p = 1,为了生产 n = 60 个蛋糕,可以这么操作:

  • 第一天:m * w = 1 * 2 = 2 生产 2 个蛋糕,同时新增 2 台机器,此时 m = 3,剩余蛋糕 0

  • 第二天:m * w = 3 * 2 = 6 生产 6 个蛋糕,同时新增 3 台机器,3 个工人,此时 m = 6, w = 5,剩余蛋糕 0

  • 第三天:m * w = 6 * 5 = 30

  • 第四天:m * w = 6 * 5 = 30 所以在第四天就完成了生产计划

输入格式

输入的数据只有一行,空格分割的四个整数,代表 m, w, p, n

数据约束

  • 1 <= m, w, p, n <= 10^8

输出格式

输出一个整数用来表示需要几天才能完成生产计划

输入样例

3 1 2 12

输出样例

3

样例解释

  • 第一天:生产的蛋糕数量 m * w = 3 * 1 = 3。此时花 2 个蛋糕,雇佣了另外一个工人,此时 w = 2,依然剩余 1 个蛋糕

  • 第二天:生产的蛋糕数量 3 * 2 = 6。此时花 2 * p = 4 个蛋糕雇佣了另外一个工人,同时新增了另外一台机器,此时 m = 4, w = 3,而且剩余 3 个蛋糕(包括第一天剩余的那一个)

  • 第三天:生产的蛋糕数量 4 * 3 = 12,已经符合预期的产量了,所以只需要三天就可以完成生产计划

解题思路: 

问题理解

小明的蛋糕工厂每天可以生产 m * w 个蛋糕。为了尽快完成生产 n 个蛋糕的任务,他可以选择用蛋糕购买额外的机器或工人,每台机器或每个工人需要花费 p 个蛋糕。目标是计算出最少需要多少天才能完成生产计划。

数据结构选择

由于我们需要动态地调整机器和工人的数量,并且需要计算每天的生产量和剩余蛋糕数,因此我们可以使用一个循环来模拟每一天的生产过程。

算法步骤

  1. 初始化

    • 初始机器数量 m
    • 初始工人数量 w
    • 每天的生产成本 p
    • 目标生产量 n
    • 当前天数 days
    • 当前剩余蛋糕数 cakes
  2. 循环模拟每一天

    • 计算当天的生产量 production = m * w
    • 更新剩余蛋糕数 cakes += production
    • 检查是否已经达到目标生产量 n,如果是,则返回当前天数 days
    • 计算可以购买的机器和工人的最大数量 max_buy = cakes / p
    • 尝试用剩余的蛋糕购买机器和工人,使得 m * w 最大化
    • 更新机器和工人的数量
    • 增加一天 days++
  3. 返回结果

    • 当达到或超过目标生产量 n 时,返回当前天数 days

关键点

  • 在每次购买机器和工人时,需要考虑如何分配购买的资源,使得 m * w 最大化。
  • 需要动态调整机器和工人的数量,以确保每天的生产量最大化。

 

最终代码:

#include <iostream>
#include <algorithm>
#include <limits>

int solution(int m, int w, int p, int n) {
    int passes = 0;
    long long candy = 0;  // 使用 long long 防止溢出
    long long run = std::numeric_limits<long long>::max();

    while (candy < n) {
        if (m > std::numeric_limits<long long>::max() / w) {
            break;
        } else {
            int step = (p - candy) / (m * w);
            if (step <= 0) {
                int mw = candy / p;
                if (m >= w + mw) {
                    w += mw;
                } else if (w >= m + mw) {
                    m += mw;
                } else {
                    int total = m + w + mw;
                    m = total / 2;
                    w = total - m;
                }
                candy %= p;
                step = 1;
            }
            passes += step;

            if (step * m > std::numeric_limits<long long>::max() / w) {
                candy = std::numeric_limits<long long>::max();
            } else {
                candy += step * m * w;
                run = std::min(run, static_cast<long long>(passes) + ((n - candy + m * w - 1) / (m * w)));
            }
        }
    }

    return std::min(passes, static_cast<int>(run));
}

int main() {
    std::cout << (solution(3, 1, 2, 12) == 3) << std::endl;
    std::cout << (solution(10, 5, 30, 500) == 8) << std::endl;
    std::cout << (solution(3, 5, 30, 320) == 14) << std::endl;

    return 0;
}

运行结果: 

二、优质章节的连续选择 

问题描述

番茄小说上有很多精彩的书籍,编辑想从其中一本书籍中挑选出若干精彩章节。这本书有 n 个章节,每个章节的文字数量分别为 a[i](1≤i≤n)。

出于阅读体验的考虑,编辑希望挑选出来的章节是在书中是连续的,并且总字数不超过 k。

编辑是特别的书虫,他认为在挑选出来的章节中,如果某个章节的文字数量比前后章节都多,则这个章节是优质章节。挑选出来章节中的第一章和最后一章不能作为优质章节。

编辑想知道,如何挑选才能产生尽可能多的优质章节,并且满足总字数不超过 k。

输入格式

第一行是整数 n 和 k;(3≤n≤10^5,0≤k≤10^9)

第二行是 n 个整数 a[i];(1≤a[i]≤10^7)

输出格式

输出整数 m、start、end,m 表示优质章节的数量,start 表示挑选出来的首个章节在书中的位置,end 是挑出来的末尾章节在书中的位置;

如果优质章节数量相同的选择有多个,则输出总字数最少的选择;如果仍有多个,则输出 start 最小的选择;

题目保证至少有一种选择。

输入样例 1

8 15000

1000 3000 2000 4000 3000 2000 4000 2000

输出样例 1

2 1 5

输入样例 2

8 15000

2000 5000 2000 1000 4000 2000 4000 3000

输出样例 2

2 4 8

样例解释

样例 1,选择第 1 章到第 5 章,一共有 2 个优质章节,分别是第 2 章和第 4 章;

样例 2,选择第 4 章到第 8 章,一共有 2 个优质章节,分别是第 5 章和第 7 章;

数据范围

(3≤n≤10^5,0≤k≤10^9)

(1≤a[i]≤10^7)

 

解题思路:

问题理解

  1. 目标:从一本书的连续章节中挑选出总字数不超过 k 的章节,使得优质章节(比前后章节字数都多的章节)的数量最多。
  2. 约束
    • 章节必须是连续的。
    • 总字数不超过 k
    • 优质章节不能是挑选出来的第一个或最后一个章节。

数据结构选择

  • 数组:用于存储每个章节的字数。
  • 滑动窗口:用于在数组中寻找满足条件的连续子数组。

算法步骤

  1. 初始化

    • 使用两个指针 start 和 end 来表示当前窗口的开始和结束位置。
    • 使用变量 current_sum 来记录当前窗口的总字数。
    • 使用变量 best_start 和 best_end 来记录最优解的开始和结束位置。
    • 使用变量 best_quality_count 来记录最优解中的优质章节数量。
  2. 滑动窗口

    • 从左到右遍历数组,逐步扩展 end 指针,直到总字数超过 k
    • 当总字数超过 k 时,移动 start 指针,直到总字数再次小于等于 k
    • 在每次移动 end 指针时,检查当前窗口内的优质章节数量,并更新最优解。
  3. 优质章节判断

    • 对于每个窗口,遍历其中的章节,判断是否为优质章节(比前后章节字数都多)。
    • 注意:第一个和最后一个章节不能作为优质章节。
  4. 结果输出

    • 最终输出最优解的优质章节数量、开始位置和结束位置。

最终代码:

#include <bits/stdc++.h>

std::string solution(int n, int k, std::vector<int> array_a) {
    assert(n == array_a.size());
    assert(3 <= n && n <= 1e5);
    assert(0 <= k && k <= 1e9);

    std::vector<long long> sum_array(n);
    sum_array[0] = array_a[0];
    for (int i = 1; i < n; ++i) {
        sum_array[i] = sum_array[i - 1] + array_a[i];
        assert(1 <= array_a[i] && array_a[i] <= 1e7);
    }

    auto get_sum_from_a_to_b = [&](int left, int right) -> long long {
        return sum_array[right] - (left > 0 ? sum_array[left - 1] : 0);
    };

    std::deque<int> q;
    int ans = 0;
    int start = -1, end = -1;
    long long total_size = -1;

    for (int i = 1; i < n - 1; ++i) {
        if (array_a[i] > array_a[i - 1] && array_a[i] > array_a[i + 1]) {
            q.push_back(i);
            while (!q.empty() && get_sum_from_a_to_b(q.front() - 1, q.back() + 1) > k) {
                q.pop_front();
            }
            if (!q.empty()) {
                long long current_size = get_sum_from_a_to_b(q.front() - 1, q.back() + 1);
                if (q.size() > ans || (q.size() == ans && total_size > current_size)) {
                    ans = q.size();
                    start = q.front() - 1;
                    end = q.back() + 1;
                    total_size = current_size;
                }
            }
        }
    }

    assert(ans != 0);
    std::ostringstream oss;
    oss << ans << "," << start + 1 << "," << end + 1;
    return oss.str();
}

int main() {
    std::cout << (solution(8, 15000, {1000, 3000, 2000, 4000, 3000, 2000, 4000, 2000}) == "2,1,5") << std::endl;
    std::cout << (solution(8, 15000, {2000, 5000, 2000, 1000, 4000, 2000, 4000, 3000}) == "2,4,8") << std::endl;
    std::cout << (solution(5, 10000, {3000, 4000, 1000, 5000, 2000}) == "1,1,3") << std::endl;
    std::cout << (solution(6, 8000, {1000, 2000, 3000, 4000, 500, 2500}) == "1,3,5") << std::endl;
    std::cout << (solution(10, 5000, {500, 1000, 1500, 500, 500, 1000, 1500, 500, 500, 1000}) == "1,2,4") << std::endl;

    return 0;
}

运行结果: 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦拷贝DM_HOME的复制安装

近期一个项目需求&#xff0c;需要在没有安装包的情况下&#xff0c;将达梦数据库安装到虚机上&#xff08;生产机上安装了达梦&#xff09;&#xff0c;故采用直接打包生产机DM_HOME的方式拷贝至虚机&#xff0c;再依次执行达梦的部分指令完成安装。以下为验证的步骤&#xff…

网络工程师 (3)指令系统基础

一、寻址方式 &#xff08;一&#xff09;指令寻址 顺序寻址&#xff1a;通过程序计数器&#xff08;PC&#xff09;加1&#xff0c;自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址&#xff1a;通过转移类指令直接或间接给出下一条指令的地址。跳…

第一届“启航杯”网络安全挑战赛WP

misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…

DeepSeek R1与OpenAI o1深度对比

文章目录 引言技术原理DeepSeek R1OpenAI o1 性能表现官方数据推理任务知识密集型任务通用能力 价格对比应用场景科研与技术开发自然语言处理&#xff08;NLP&#xff09;企业智能化升级教育与培训数据分析与智能决策 部署与集成DeepSeek R1OpenAI o1 伦理考量DeepSeek R1OpenA…

图漾Halcon版本SDK使用教程【V1.1.0新版本】

1.下载并安装 Halcon 1.1 下载Halcon软件 在 Halcon 官网(https://www.mvtec.com/downloads) 下载 Halcon (Windows 版) 安装包&#xff0c;并根据官方文档安装 Halcon&#xff0c;下载HALCON24.11Progress-Steady。 1.2 安装Halcon 1.解压HALCON 24.11.1.0的安装包压缩文件…

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完&#xff0c;确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…

算法题(49):反转链表II

审题&#xff1a; 需要我们对指定范围的链表进行反转&#xff0c;并返回反转后链表的头结点 思路&#xff1a; 方法一&#xff1a;vector法 我们先遍历一次链表&#xff0c;并把数据对应的存在数组中&#xff0c;然后利用数组的reverse方法进行反转数据&#xff0c;最后再遍历一…

基于SpringBoot多数据源解决方案

最近在学习SpringBoot的时候&#xff0c;需要同时用两个不同的数据库连接服务&#xff0c;在网上学习了之后&#xff0c;下文以连接一个MySQL数据库和一个SqlServer数据库为例。 配置数据源连接信息 在配置文件中&#xff0c;配置对应的数据库连接信息&#xff0c;相比于单数…

通过案例研究二项分布和泊松分布之间关系(2)

通过案例研究二项分布和泊松分布之间关系 2. 汽车出事故的概率p与保险公司盈利W之间的关系3.通过遗传算法多次迭代计算控制p为多少时公司盈利最大(1) 计算过程(2) 结果及分析(计算过程详见附录二程序) 4.改变思路求解固定p为0.01时,保险费用如何设置公司可获得最大利润(1)计算过…

RISC-V读书笔记4

目录 乘法与除法 RV32F 和 RV32D&#xff1a;单精度和双精度浮点数 原子操作 压缩指令 向量 乘法与除法 RV32M属于扩展的指令&#xff0c;主要扩展的就是便捷的乘法和除法指令。 除法&#xff1a; 商 (被除数− 余数) 除数 被除数 除数 商 余数 余数 被除数− (商 …

【Uniapp-Vue3】request各种不同类型的参数详解

一、参数携带 我们调用该接口的时候需要传入type参数。 第一种 路径名称?参数名1参数值1&参数名2参数值2 第二种 uni.request({ url:"请求路径", data:{ 参数名:参数值 } }) 二、请求方式 常用的有get&#xff0c;post和put 三种&#xff0c;默认是get请求。…

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

2000-2020年各省第二产业增加值占GDP比重数据

2000-2020年各省第二产业增加值占GDP比重数据 1、时间&#xff1a;2000-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、第二产业增加值占GDP比重 4、范围&#xff1a;31省 5、指标解释&#xff1a;第二产业增加值占GDP比重…

【Docker】Docker入门了解

文章目录 Docker 的核心概念Docker 常用命令示例&#xff1a;构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么&#xff1f;****为什么 C 开发者需要 Docker&#xff1f;** **二、核心概…

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则&#xff08;记住&#xff09; 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 &#xff08;1&#xff09;开闭原则&#xff08;Open Close Principle…

初阶2 类与对象

本章重点 上篇1.面向过程和面向对象初步认识2.类的引入---结构体3.类的定义3.1 语法3.2 组成3.3 定义类的两种方法&#xff1a; 4.类的访问限定符及封装4.1 访问限定符4.2封装---面向对象的三大特性之一 5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小 8.this指…

蓝桥杯模拟算法:多项式输出

P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题&#xff0c;我们需要分情况讨论&#xff0c;我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…

深度剖析C++17中的std::optional:处理可能缺失值的利器

文章目录 一、基本概念与设计理念二、构建与初始化&#xff08;一&#xff09;默认构造&#xff08;二&#xff09;值初始化&#xff08;三&#xff09;使用std::make_optional&#xff08;四&#xff09;使用std::nullopt 三、访问值&#xff08;一&#xff09;value()&#x…

MySQL用户授权、收回权限与查看权限

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…