2023年蓝桥杯省赛——买二赠一

目录

题目链接:1.买二赠一 - 蓝桥云课 (lanqiao.cn)

题目描述

输入格式

输出格式

样例输入

样例输出

样例说明

思路

队列+贪心

代码实现

总结


题目链接:1.买二赠一 - 蓝桥云课 (lanqiao.cn)

题目描述


        某商场有 N 件商品,其中第 i 件的价格是 Ai。现在该商场正在进行 “买二赠一” 的优惠活动,具体规则是:

        每购买 2 件商品,假设其中较便宜的价格是 P(如果两件商品价格一样,则 P 等于其中一件商品的价格),就可以从剩余商品中任选一件价格不超过 P/2的商品,免费获得这一件商品。可以通过反复购买 2 件商品来获得多件免费商品,但是每件商品只能被购买或免费获得一次。

        小明想知道如果要拿下所有商品(包含购买和免费获得),至少要花费多少钱?

输入格式


        第一行包含一个整数 N。

        第二行包含 N 个整数,代表 A1, A2, A3, . . . ,AN。

输出格式


        输出一个整数,代表答案。

样例输入


7
1 4 2 8 5 7 1
1
2


样例输出


25
1


样例说明


        小明可以先购买价格 4 和 8 的商品,免费获得一件价格为 1 的商品;再后买价格为 5 和 7 的商品,免费获得价格为 2 的商品;最后单独购买剩下的一件价格为 1 的商品。总计花费 4 + 8 + 5 + 7 + 1 = 25。不存在花费更低的方案。

对于 30% 的数据,1 ≤ N ≤ 20。

对于 100% 的数据,1 ≤ N ≤ 5 × 105,1 ≤ Ai ≤ 109


思路

队列+贪心

        这题,我真的没有爆出来一个用例,因为它真的是需要走一步考虑一步的一道题目,而且暴力的话并不好操作,所以暴力思路在这里真的就是完全骗不到分了。

        我们可以使用队列和贪心来解决这个问题。其实一直会有同学有疑惑,你的贪心代码在哪里就像动态规划的递推公式一样,看不到一个实际上存在的东西啊。看不到是因为贪心这个思路真的就是和你思维的思路是一样的。就比如这道题,我们就是要占最大的便宜,也就是买最贵的两个东西来获取最大的便宜的价格。

        这里的队列是如何使用的,或者说是如何工作的呢?这里我们使用队列来存储有多少额度的优惠可以使用。然后根据我们现将贵的东西买走,那么队列里先进入的一定是较大的优惠力度,然后我们在循环之中每次都判断当前商品的价格是否小于或者等于在队列中存储到的,已经拥有了的优惠。如果有的话就可以不加这个商品的价格了,我们直接进入下一次循环即可。

        主循环的详细解释:

        从价格最高的商品开始向下检查商品(因为 nums 数组现在是按价格排序的):

  • 如果队列非空,并且当前商品的价格小于或等于队列头部的元素(即可以免费获取的商品的上限价格),则将队列头部元素弹出,表示已经找到了可以免费获取的商品。
  • 如果当前商品不能免费获取,则需要判断是否应该被视为第二次购买:
    • 如果是,将当前商品价格的一半加入队列(表示下一次可以免费获取的商品的价格上限),并且将 flag 设置为 false,表示下一次购买视为第一次购买。
    • 如果不是,将 flag 设置为 true,表示下一次购买视为第二次购买。

代码实现

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 接收整数 nint n = sc.nextInt();// 接收每件商品的价格int[] nums = new int[n];for(int i = 0; i < n; i++) {nums[i] = sc.nextInt();}sc.close();// 将商品的价格从小到大的排序Arrays.sort(nums);// 定义出我们的pos当做指针,指向操作的商品的索引int pos = n - 1;Queue<Integer> queue = new LinkedList<Integer>();// 信号位,用于判断是否是第二次购买boolean flag = false;// 初始化结果为0,这里使用long型,因为数据有点大long res = 0L;// 进入贪心的循环之中while(pos >= 0) {// 如果上一轮给的免费额度足够这次的商品的价格// 那么将商品弹出即可,不用加入到res中if (!queue.isEmpty() && nums[pos] <= queue.peek()) {queue.poll();}else {if (flag) {// 是第二次购买则增加免费次数queue.add(nums[pos] / 2);// 然后使用了免费的次数,再将flag修改为falseflag = false;}else {// 这次是第一次,那么下一次就是第二次了,将flag修改为trueflag = true;}// 加到结果中res += nums[pos];}pos--;}System.out.println(res);}
}

AC喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽喽!!!!!!!!!!


总结

        其实这道题的思路难就难在呃,斯~~哪里难了。。。。。。。。。。。。。。。。

好吧,其实这里如果被题目迷惑的话,会有难度。

        来我们来看这个坑die题目的样例说明,小明可以先购买4和8,然后免费获得价格为1的商品,然后再购买5和7然后获得价格为2的商品。这个其实很难不让人往一种组合的方向上寻找答案,然后找不到便只能是放弃了。但是其实这道题我们可以不着急选赠送给我们的商品,就像这个案例一样。

1 2 2 4 5 7 8

        我们直接豪掷千金买下7和8,那么7 / 2 = 3,此时就已经有了一个额度为 3 的免费的“卷”,那么接下来就可以在遇到商品的价格小于等于3的时候直接免费拿下这个商品了,因为我们的从后往前来消费的,所以这里一定是可以免费的商品中最贵的那一个。然后接着循环即可找到最后的res结果了。 

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

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

相关文章

漫谈:“标准”是一种幻觉 C++语言标准的意义

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 “标准”这个词很迷惑&#xf…

铸铁平台的单围和双围是什么——北重机械

铸铁平台的单围和双围是指平台的围栏结构。单围指平台只有一面围栏&#xff0c;通常用于平台的三个边界上&#xff0c;另一边是与建筑物相连的。双围指平台两侧围栏都有&#xff0c;即平台四个边界都有围栏。双围结构比单围结构更加安全&#xff0c;可以防止人员和物品从平台四…

CleanmyMac 苹果电脑清理软件,为你的 Mac 提速!

Apple Macbook 已成为当今职场不可或缺的高效助手&#xff0c;尤其在普遍的远程办公场景下&#xff0c;其运行流畅度对工作效率及用户体验至关重要。虽然长期使用会使Mac电脑性能自然衰退&#xff0c;但大部分导致系统变慢的因素其实可经由用户自行调整得到显著改善&#xff0c…

linux 设置命令输入行高亮(与软件无关:xshell等)

在命令执行后输出内容比较多的情况下,很难查看自己的历史命令 这个配置是系统的配置:取消.bashrc文件中force_color_prompt=yes的注释即可 (和连接服务器的软件无关) 具体的操作如下: 执行以下命令,查看配置所在的行数root@hecs-166280:~# cat .bashrc -n | grep force_…

Java Lambda 表达式(详细)

Java Lambda 表达式 Lambda 的发展史 Java Lambda 表达式是在 Java 8 版本中引入的重要特性&#xff0c;它描述了一种更简洁、更灵活的方式来处理函数式编程。 在 Java 8 之前&#xff0c;要实现函数式编程&#xff0c;需要通过匿名类实现接口的方式。这样的代码通常比较冗长…

深入MyBatis的动态SQL:概念、特性与实例解析

MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff0c;即普通的 Java 对象为数据库中的记…

MacOS Docker 部署 Redis 数据库

一、简介 Redis是一个开源的、使用C语言编写的、基于内存亦可持久化的Key-Value数据库&#xff0c;它提供了多种语言的API&#xff0c;并支持网络交互。Redis的数据存储在内存中&#xff0c;因此其读写速度非常快&#xff0c;每秒可以处理超过10万次读写操作&#xff0c;是已知…

milvus search api的数据结构

search api的数据结构 此api的功能是向量相似度搜索(vector similarity search) 一个完整的search例子: 服务端collection是一个hnsw类型的索引。 import random from pymilvus import (connections,Collection, )dim 128if __name__ __main__:connections.connect(alias…

Django检测到会话cookie中缺少HttpOnly属性手工复现

一、漏洞复现 会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本等)获取到用户的cookie信息&#xff0c;造成用户cookie信息泄露&#xff0c;增加攻击者的跨站脚本攻击威胁。 第一步&#xff1a;复制URL&#xff1a;http://192.168.43.219在浏览器打开&#xff0c;…

基于java JSP 实现的固定资产管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统展示 前台首页功能模块 固…

Spring: 后端状态码如何与http状态码保持一致

文章目录 一、背景二、解决方案 一、背景 今天使用postman在做接口测试的时候发现了一个有趣的问题&#xff1a;响应体的status和http的status一样&#xff0c;出于好奇对该现象进行了总结。 二、解决方案 通过拦截器ResponseBodyAdvice&#xff0c;做到统一拦截 Controll…

day03 51单片机

51单片机学习 1 模块化编程 1.1 什么是模块化编程 随着我们的代码越来越复杂,我们的main.c越来越长,阅读性也越来越差。如果将来开始做项目,我们可能要同时操作好几个模块,这种情况下我们无法再把代码写到同一个文件,而是要分模块管理代码。 具体实现方法,就是将源码…

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…

YOLOV8 + 双目测距

YOLOV8 双目测距 1. 环境配置2. 测距流程和原理2.1 测距流程2.2 测距原理 3. 代码部分解析3.1 相机参数stereoconfig.py3.2 测距部分3.3 主代码yolov8-stereo.py 4. 实验结果4.1 测距4.2 测距跟踪4.3 测距跟踪分割4.4 视频展示 相关文章 1. YOLOv5双目测距&#xff08;python&…

matlab/simulink仿真全合集---电力电子的simulink仿真

simulink仿真新手大礼包&#xff0c;共整理了9份simulink仿真模型&#xff0c;每一份都是完美运行&#xff0c;适合电气工程专业/电力电子专业的新手学习。 1、Boost电路 simulink 仿真&#xff0c;boost 电路模块搭建和用传递函数进行验证&#xff0c; 电流开环控制 、电流闭…

Jackson(json) 与其他格式数据的转换

目录 第一章、Jackson 介绍1.1&#xff09;Jackson 依赖导入1.2&#xff09;转义字符介绍介绍 第二章、Jackson 与其他格式数据的转换2.1&#xff09;其他数据转为JSON格式数据&#xff08;生成JSON&#xff09;①对象转json&#xff0c;比如我有一个user对象②list转json③map…

内存管理机制SLAB

1. 为什么需要内存分配管理&#xff1f;为什么需要SLAB&#xff1f; 在学习c语言时&#xff0c;我们常常会使用到malloc()去申请一块内存空间&#xff0c;用于存放我们的数据&#xff0c;这是代码层面的语言 如果我们想要关心malloc这个命令向系统发出后&#xff0c;系统会做什…

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…

室友打团太吵?一条命令让它卡死

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;更多干货&#xff0c;请关注专栏《网络安全自学教程》 SYN Flood 1、hping3实现SYN Flood1.1、主机探测1.2、扫描端…

文本识别 OCR 解决方案

Capture2Text 便携式 OCR 工具 Capture2Text 能够使用键盘快捷键快速对屏幕的一部分进行 OCR。 默认情况下&#xff0c;生成的文本将保存到剪贴板。支持中文、英文、法文、德文、日文、韩文、俄文、西班牙文等 90 多种语言。 Capture2Text 是便携式工具&#xff0c;不需要安装…