信息学奥赛初赛天天练-75-NOIP2016普及组-完善程序-二分答案、二分查找、贪心算法、贪心策略

news2024/11/13 10:03:05

文章PDF链接: https://pan.baidu.com/s/1SVcGU_rApvoUWrUoviPCiA?pwd=ht2j 提取码: ht2j
复制这段内容后打开百度网盘手机App,操作更方便哦

1 完善程序 (单选题 ,每小题3分,共30分)

郊游活动

有 n名同学参加学校组织的郊游活动,已知学校给这 n名同学的郊游总经费为 A元,与此同时第 i位同学自己携带了 Mi 元。为了方便郊游,活动地点提供 B(≥n) 辆自行车供人租用,租用第 j辆自行车的价格为 Cj元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。(第四、五空 2.5 分,其余 3分)

本题采用二分法。对于区间 [l,r],我们取中间点 mid 并判断租用到自行车的人数能否达到 mid。判断的过程是利用贪心算法实现的。

源程序

#include <iostream>
using namespace std;
01 #define MAXN 1000000
02 
03 int n, B, A, M[MAXN], C[MAXN], l, r, ans, mid;
04 
05 bool check(int nn) {
06 	int count = 0, i, j;
07 	i = ①;
08 	j = 1;
09 	while (i <= n) {
10 		if(②)
11 			count += C[j] - M[i];
12 		i++;
13 		j++;
14 	}
15 	return ③;
16 }
17 	
18 void sort(int a[], int l, int r) {
19 	int i = l, j = r, x = a[(l + r) / 2], y;
20 	while (i <= j) {
21 		while (a[i] < x) i++;
22 		while (a[j] > x) j--;
23 		if (i <= j) {
24 			y = a[i]; a[i] = a[j]; a[j] = y;
25 			i++; j--;
26 		}
27 	}
28 if (i < r) sort(a, i, r);
29 if (l < j) sort(a, l, j);
30 }
31 
32 int main() {
33 	int i;
34 	cin >> n >> B >> A;
35 	for (i = 1; i <= n; i++)
36 		cin >> M[i];
37 	for (i = 1; i <= B; i++)
38 		cin >> C[i];
39 	sort(M, 1, n);
40 	sort(C, 1, B);
41 	l = 0;
42 	r = n;
43 	while (l <= r) {
44 		mid = (l + r) / 2;
45 		if(④){
46             ans = mid;
47 			l = mid + 1;
48 		}else
49 			r = ⑤;
50 	}
51 	cout << ans << endl;
52 	return 0;
53 }

1 ①处应填( )

2 ②处应填( )

3 ③处应填( )

4 ④处应填( )

5 ⑤处应填( )

2 相关知识点

二分答案

二分答案顾名思义,它用二分的方法枚举答案,并且枚举时判断这个答案是否可行

直接对答案进行枚举查找,接着判断答案是否合法。如果合法,就将答案二分进一步靠近,如果不合法,就接着二分缩小判断。这样就可以大大的减少时间。

二分中有时可以得可行得答案,但不是最大的,继续向右靠近,求出最大值

 int ans = 1;
 int l = 1,r = 100000;//在1~100000之间的整数枚举 
 while(l <= r){
     int m = l + (r - l) / 2;
     if(check(m)){//满足 则进行向右缩小范围 看看有没有更大的 
         ans = m;//可能多次赋值 最后一定是可能的最大值 
         l = m + 1;
      }else{//不满足缩小边长 向左缩小范围 用更小边长继续尝试 
         r = m - 1;
	  } 
  }

二分找边界

//左闭右闭 while left right 最终left=right+1
while(left<=right)  left = mid + 1; right =mid-1;
//左闭右开 while left right 最终left=right
while(left<right)   left = mid + 1; right =mid;
//左开右闭 while left right 最终left=right
while(left<right)   left=mid;       right=mid-1;
//左开右开 while left right 最终left=right-1
while(left+1<right) left=mid;       right=mid;

二分查找时间复杂度

二分查找每次都缩小或扩大为原来的一半,所以也是Olog(n)

贪心算法

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择 。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解

例题

某商店不能电子支付,钱柜里的货币只有 25 分、10 分、5 分和 1 分四种硬币,如果你是售货员且要找给客户 41 分钱的硬币,如何安排才能找给客人的钱既正确且硬币的个数又最少?

分析

钱币保证最大面额大于其他小于它的面额之和,保证了每次选择最大的没有其他优于这个组合

即 选择了25 即使选择10+5+1=16都比25小

每次选择找零面额最大的,每次都是本次最优(局部最优),根据钱币面额本身的性质可知,可以保证全局最优

3 思路分析

求最多有多少位同学能够租用到自行车,总共n位同学,1~n 位同学之间二分的方法判定是否可以能租

判定是否可以租,使用贪心算法,具体如下

贪心策略,较多钱的同学去租相对便宜的车

//判定nn位同学是否可以租到自行车
05 bool check(int nn) {
06 	int count = 0, i, j;
07 	i = ①;//n-nn+1 取钱较多的nn个人 贪心算法
08 	j = 1;//租车费用从小到大租,贪心算法
09 	while (i <= n) {
10 		if(②)//M[i]<C[j] 如果当前同学带的钱不够,累加起来,看看学校经费是否够
11 			count += C[j] - M[i];
12 		i++;
13 		j++;
14 	}
15 	return ③;//count<=A 看学校经费是否够 ,经费够可以租nn辆车,经费不够不能租nn辆车
16 }

1 ①处应填( n-nn+1 )

分析

07 	i = ①;//n-nn+1 取钱较多的nn个人 贪心算法
例如
n=10 nn=6 
从10-6+1=5,到10这6个人
因为前面按从小到大进行了排序
5~10这6人,比1~6这6人有钱

2 ②处应填( M[i]<C[j] )

分析

10 		if(②)//M[i]<C[j] 如果当前同学带的钱不够,累加起来,看看学校经费是否够
如果钱带的够,就可以租n辆车
为了让钱不够的同学租到车,需要从学校经费借钱,把借的钱累加起来,后续判定是否超出经费

3 ③处应填( count<=A )

分析

15 	return ③;//count<=A 看学校经费是否够 ,经费够可以租nn辆车,经费不够不能租nn辆车

4 ④处应填( check(mid) )

分析

/*二分思想,计算左右边界的中间租车数量,如果可以组,看看能否可以租更多,如果不能租,看看少租一些车是否可行
mid = (l + r) / 2;
check(mid)
*/
43 	while (l <= r) {
44 		mid = (l + r) / 2;
45 		if(④){
46             ans = mid;
47 			l = mid + 1;
48 		}else
49 			r = ⑤;
50 	}

5 ⑤处应填( mid-1 )

分析

二分边界,如下为左右闭区间,l=mid+1,r=mid-1
所以填mid-1
43 	while (l <= r) {

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

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

相关文章

gateway的学习

1.网关的作用 1.负载均衡 2.过滤器的使用 1.通过配置文件实现的过滤器 2.代码逻辑层面实现全局过滤器 //全局过滤器代码逻辑实现 Component //Order(1):注解配置过滤器的执行顺序 public class GlobalFilter implements GatewayFilter, Ordered {/*** 处理当前请求&#xff0c;…

RocketMQ~高性能设计与实现(零拷贝技术)、多种集群模式

与Kafka类似&#xff0c;RocketMQ也使用了零拷贝技术、对于分区&#xff0c;其也有分队列的思维在。 零拷贝技术 传统的IO读写其实就是readwrite的操作&#xff0c;整个过程会分为如下几步 用户调用read()方法&#xff0c;开始读取数据&#xff0c;此时发生一次上下文从用户…

Storage:Keeping memories in the brain(存储:把记忆保存在大脑中)

Once you’ve encoded information, you now need to store it. Unfortunately, forgetting is a major part of how our brains work.Most of us can’t remember what we had for dinner Tuesday, three weeks ago.However, we can all remember our first kiss. 一旦完成了信…

工厂模式和策略模式的区别和各自的实现

工厂模式和策略模式是两种不同的设计模式&#xff0c;它们分别解决的是创建对象和定义算法家族的问题。 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;使得创建对象的过程与使…

如何发布年会通知?

在组织年会等重要活动时&#xff0c;确保每位参与者都能及时接收到通知至关重要。本文将指导您如何利用云分组平台发布年会通知&#xff0c;并通过查询功能为参与者提供座位号等信息。一、电脑端上传查询信息 1. 登录云分组官网 访问官网并通过微信扫码登录。2. 进入查询菜单 在…

通过因子分析识别消费者偏好的潜在因素的案例

因子分析是一种统计方法&#xff0c;用于研究变量之间的潜在关系。它是一种降维技术&#xff0c;通过识别较少数量的因子&#xff08;或称为维度、成分&#xff09;来解释多个观测变量之间的相关性。这些因子是不可观测的潜在变量&#xff0c;它们被认为是原始变量的潜在原因。…

厦门凯酷全科技有限公司抖音小店的新蓝海开启电商新篇章

在数字经济的浪潮中&#xff0c;电子商务以其独特的魅力和无限潜力&#xff0c;正以前所未有的速度改变着我们的消费方式和商业模式。作为这股浪潮中的佼佼者&#xff0c;厦门凯酷全科技有限公司凭借其敏锐的市场洞察力和前瞻性的战略布局&#xff0c;成功在抖音小店这一新兴平…

乐凡北斗卫星通信终端,多场景应用

北斗卫星通信终端在民生保障、抗险减灾、野外搜救、海洋渔业、交通运输、边境巡防等多个领域都有广阔的应用空间。在不同场景下&#xff0c;乐凡北斗卫星通信终端发挥着各自独特而关键的作用&#xff0c;其强大的定位功能和北斗三代短报文功能保障了信息的高效传递和任务的顺利…

Context-dependence:Why your environment matters(情境依赖:为什么环境很重要)

Consider an everyday situation:You get up from your desk to have a cup of tea.Once you arrive in the kitchen, you forget what you wanted.However, when you get back to your desk, you suddenly remember. 考虑一个日常会遇到的情况:你从桌旁起身想要倒杯茶&#xf…

内存管理篇-09伙伴系统初始化一:memblock管理

1.伙伴系统的初始化概述 硬件初始化&#xff1a;计算机加电后进行硬件检测。加载引导程序&#xff0c;将Linux内核加载到内存中。 内核初始化&#xff1a;内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。 内存管理初始化&…

Chat App 项目之解析(四)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

Nature Communications | 全球草地土壤碳储量随植物多样性的增加而增加

在许多生态系统中物多样性与土壤有机碳(SOC)储量呈正相关。最可能的原因是植物多样性积极影响植物生产力&#xff0c;从而影响土壤的有机碳输入量。大多数关于植物多样性对植物生产力和有机碳储量影响的证据都是基于控制植物物种丰富度的小规模实验。然而&#xff0c;那些短期的…

Flink入门(五)--Flink算子

Map DataStream → DataStream 一个接受一个元素并产生一个元素的函数。 示例 dataStream.map { x > x * 2 } FlatMap DataStream → DataStream 一个接受一个元素并产生零个、一个或多个元素的函数。 例如 dataStream.flatMap { str > str.split(" ") }…

把直播间搬到工厂,淘宝直播打造卖爆新路径

又一年中秋将至&#xff0c;电商平台们再度开启了月饼生意。 8月21日&#xff0c;杭州&#xff0c;淘宝直播的主播们组成“白月光”队和“黑月牙”队&#xff0c;下工厂&#xff0c;探访体验馆&#xff0c;开始了一场“寻月之旅”。“我们米月饼的饼皮是根据南宋糕点改良而来”…

C语言小项目源码大全(60套)

C语言小项目源码大全60套 目录源码文件 目录 纯c语言迷宫源码.exe . c语言五子棋源码.exe c语言24点游戏源码.exe c语言万年历源码.exe c语言别踩白块儿(双人版)源码.exe c语言奔跑的火柴人游戏源码.exe c语言吃逗游戏源码.exe C语言超市管理系统.exe c语言对对碰游戏…

【CSP:202212-2】训练计划(Java)

题目链接 202212-2 训练计划 题目描述 求解思路 模拟&#xff1a; over表示能否按时完成所有训练项目rely[i]表示第i个项目的依赖项目编号&#xff08;每个项目最多有一个依赖项目&#xff09;days[i]用来记录第i个项目完成需要的天数allDays[i]表示加上该项目的所有前置依赖…

面向对象09:instanceof和类型转换

‌ 本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 instanceof是Java中的一个二元运算符&…

浅谈【数据结构】栈和队列之队列

目录 1、队列 1.1思想 2、队列的两类 2.1顺序队列 2.2链式队列 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&a…

MATLAB 沿任意方向分层点云(82)

MATLAB 沿任意方向分层点云(82) 一、算法介绍二、算法实现1.代码2.效果更多内容参考: MATLAB点云处理学习 一、算法介绍 沿着某个方向,将点云分割为多层,每层点云使用不同颜色进行可视化显示,具体代码和不同方向的分层效果如下: 二、算法实现 1.代码 % Load point c…

学生信息管理系统的设计与实现(包含文档、源码、sql脚本、导入视频教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 学生信息管理系统拥有三种角色&#xff0c;分别为学生、教师和管理员&#xff0c;功能更加完善&#xff0c;可以作为初学者参照学习课程设计。 学生&#xff1a;班级通讯录查询、个人信息…