acm专题二

news/2025/1/26 15:30:05/文章来源:https://www.cnblogs.com/astronomyyy/p/18691071

一、第一题
代码:

#include<iostream>
#define N 100000
using namespace std;
int main()
{int n, q, i, l, r,mid;long long m, a[N];cin >> n;for (i = 0; i < n; i++)cin>>a[i];cin >> q;for (i = 0; i < q; i++){cin >> m;l = 0, r = n - 1;while (l < r){mid = (l + r) / 2;if (a[mid] >= m)r = mid;else l = mid + 1;}if (a[l] != m)cout << "No\n";elsecout << "Yes\n";}return 0;
}

思路:若mid位置的数大于等m,范围向左缩小,反之向右缩小,通过二分查找实现在有序数组中寻找m的功能
二、第二题
代码:

#include<iostream>
#include<algorithm>
#define N 200000
using namespace std;
int main()
{int n, i, l, r,mid,ans;long long c, a[N],count=0;cin >> n>>c;for (i = 0; i < n; i++)cin>>a[i];sort(a, a + n);for (i = 0; i < n; i++){l = i + 1, r = n - 1;while (l < r){mid = (l + r) / 2;if (a[mid] - a[i] >= c) r = mid;else l = mid + 1;}if (a[l] - a[i] == c)  ans = l;else continue;l = ans, r = n - 1;while (l < r){mid = (l + r + 1) / 2;if (a[mid] <= a[ans]) l = mid;else r = mid - 1;}count += l - ans + 1;}cout << count;return 0;
}

思路:先通过sort函数将数组升序排列,之后遍历每一个元素,分别找每个元素接下来是否有符合距离为c的数,若有则继续二分查找该数最后出现的位置,最后位置与初始位置的差值即为个数对
三、第三题
代码:

#include<iostream>
#define N 100000
using namespace std;
int h[N], w[N],k,n;
int check(int mid)
{int i,length,width,count=0;for (i = 0; i < n; i++){length = h[i] / mid; width = w[i] / mid;count += length * width;}if (count >= k) return 1;else return 0;
}
int main()
{int i, l, r,mid;cin >> n>>k;for (i = 0; i < n; i++)cin >> h[i]>>w[i];l = 1, r = 100000;while (l < r){mid = (l + r + 1) / 2;if (check(mid)) l = mid;else r = mid - 1;}cout << l;return 0;
}

思路:巧克力边长范围为一到十万,通过二分查找找到符合题意的最大值,如果以该边长进行切割,所有巧克力能切出的个数总和大于等于人数k,该边长就符合题意
四、第四题
代码:

#include<iostream>
#define N 200000
using namespace std;
int a[N], b[N],n;
long long m;
int check(int mid)
{long long count=0;for (int i = 0; i < n; i++)if(a[i]<mid) {count+=mid-a[i];if(mid-a[i]>b[i])return 0;}if (count <=m) return 1;else return 0;
}
int main()
{int i, l, r,mid,min=200001,minn;cin >> n>>m;for (i = 0; i < n; i++){cin >> a[i];if(a[i]<min) min=a[i],minn=i;}for (i = 0; i < n; i++)cin >> b[i];l = min, r = min+b[minn];while (l < r){mid = (l + r + 1) / 2;if (check(mid)) l = mid;else r = mid - 1;}cout << l;return 0;
}

思路:先找到数组中个数最少的牌,那么能凑出的牌数范围就是个数最少的牌的数量到个数最少的牌数加上可用牌数之和,在这个范围里二分查找mid答案,若每种牌要达到mid个数需要加进去的牌的总数之和没有超过拥有的牌,该mid就符合题意,同时要注意每种牌到达mid数时所加牌的数量是否在自己可加牌数范围内
五、第五题
代码:

#include<iostream>
using namespace std;
int a[500],m,k;
int check(int mid)
{int sum=0,count=1;for(int i=0;i<m;i++){if(sum+a[i]<=mid) sum+=a[i];else{sum=a[i];count++;}}if(count<=k) return 1;else return 0;
}
int main()
{int i, l, r,mid,max=0,sum=0;cin >> m>>k;for (i = 0; i < m; i++){cin >> a[i];if(a[i]>max) max=a[i];sum+=a[i];	}l = max, r = sum;while (l < r){mid = (l + r) / 2;if (check(mid)) r = mid;else l = mid + 1;}int first[k],second[k],total=0,j=k-1,f=m;for(i=m-1;i>=0;i--){if(total+a[i]<=l) total+=a[i];else{second[j]=f;total=a[i];first[j--]=i+2;f=i+1;}}second[j]=f,first[j]=i+2;for(i=0;i<k;i++)cout<<first[i]<<' '<<second[i]<<endl;return 0;
}

思路:书本数组中,所花时间的范围是最多页的书到所有书页数的总和,在这个范围内二分查找mid,若将数组最大程度分为连续总和不超过mid的几段,若段的个数小于等于k个人,证明mid符合题意,然后建立first和second数组来存储每个人需要抄写的书的范围,通过倒序遍历数组,将数组尽可能的分为连续总和不超过所求l的k段,倒序记录每段的开头结尾存入first和second数组,倒序是为了满足多解情况下让前面的人尽可能少写,最后正序输出first和second数组
六、第六题
代码:

#include<iostream>
#define N 100000
using namespace std;
int h[N],n;long long x;
int check(int mid)
{long long sum=0,i;for(i=0;i<mid;i++)sum+=h[i];if(sum<x) return 0;for(i=mid;i<n-1;i++){sum+=h[i];sum-=h[i-mid];if(sum<x) return 0;}return 1;
}
int main()
{int i, l, r,mid;cin >> n>>x;x*=2;for (i = 0; i < n-1; i++)cin >> h[i];l = 1, r = n;while (l < r){mid = (l + r) / 2;if (check(mid)) r = mid;else l = mid + 1;}cout<<l;return 0;
}

思路:因为往返本质上是一样的,因此可以看成青蛙要能走这段路走2x次,不用考虑方向,青蛙的跳跃能力范围在1到河宽n之间,通过二分查找找到最小的mid答案,因为青蛙能跳跃的点在一到跳跃能力y之间,即一到y之间的石头h的总和要大于等于2x,青蛙才能顺利完成2x次跳跃,即每1到y范围内的石头h总和都要大于等于2x,若mid符合这一点就符合题意;check函数的思路是先算出最开始的mid个数内的总和,然后开始从mid往下遍历每一个数,每次对sum进行加减更新以保证sum一直是mid个数的元素之和,每一次都对sum进行判断是否大于等于2x

学习总结:二分法的学习过程中,首先要牢记二分模板,灵活运用到不同题型中,在解题过程中应先判断需要二分的对象,接着判断check函数的判定条件;在青蛙过河题中,我明白了应对题目所给的区间有高敏感,进行大胆猜测

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

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

相关文章

Python Functools模块

代码:#coding=utf-8import functools from functools import cache from functools import cached_property, lru_cache from functools import partial, partialmethod from functools import singledispatch, singledispatchmethod from functools import update_wrapper, w…

F12调试应用:强行查看洛谷个人主页

1.前言 众所周知,洛谷的个人主页常常有些不得了的东西,但是:(洛谷估值第二名%%%)这个系统维护每次都拦着我们。 有一个比较常用的方法就是删掉域名.cn,访问外国服务器(天天炸)。所以必须要有更可靠的方法。 2.F12大法妙 这时候,我们就可以按下F12打开检查。按下左上角…

【AI+安全】看不见的AI安全威胁,揭秘隐形提示注入风险

在人工智能蓬勃发展并融合到各行各业的当前,一种新型的威胁正悄然蔓延:隐形提示注入攻击。这种看不见的攻击手段,利用了用户肉眼无法识别的特殊字符,悄无声息地影响着大语言模型的行为。它就像一个隐藏在阴影中的刺客,偷偷操纵强大的 AI 系统做出意想不到的危险行为。 如果…

unity shader 消融效果

消融效果 基础消融效果原理多方向和可控消融

React中的数据流管理

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:霜序前言💡 为什么数据流管理重要? React 的核心思想为:UI=render(data) ,data 就是所谓的数据,render 是 React 提供的纯函…

代码随想录算法训练营第9天 | 151.翻转字符串里的单词、右旋字符串、28. 实现 strStr()、重复的子字符串、字符串:总结篇、双指针回顾

一、刷题部分 1.1 151.翻转字符串里的单词原文链接:代码随想录 题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)1.1.1 题目描述 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。…

《CPython Internals》阅读笔记:p360-p377

《CPython Internals》学习第 20 天,p360-p377 总结,总计 18 页。 一、技术总结 1.seaborn 可视化工具。 2.dtrace (1)安装 sudo apt-get install systemtap-sdt-dev(2)编译 ./configure --with-dtrace make clean make3.snakeviz 适用于 cProfile 的可视化工具。 二、英语总…

goland2024如何安装?附安装包和激活方式

前言 大家好,我是小徐啊。goland是我们开发Go语言时的常用的开发工具,功能强大,今天,小徐就来介绍下如何安装和获取激活方式。文末附获取方式。 如何安装和激活goland 首先,我们双击下goland2024安装包,开始安装。然后,我们点击下运行按钮。然后,我们点击下一步按钮。然…

AI实现个人阅读网页插件

背景 日常工作中经常需要浏览各种Github项目或者一些网页,逐字逐句看总觉得不够效率,如果在每次打开一个新的页面时就能够掌握大概的内容,然后再决定是否深入阅读就方便多了。有了这样的念头后,总想自己开发一款简单的浏览器插件,但是始终没有提上日程。目前随着AI编程工具…

RabbitMQ之Exchange、Queue参数详解

1.先来介绍RabbitMQ中的成员Producer(生产者): 将消息发送到Exchange Exchange(交换器):将从生产者接收到的消息路由到Queue Queue(队列):存放供消费者消费的消息 BindingKey(绑定键):建立Exchange与Queue之间的关系(个人看作是一种规则,也就是Exchange将什么样的消息路由…

[日记]轻量回测框架 Backtesting.py 与 Streamlit集成

找到一个目前觉得比较轻量级的框架,结构简单易用,几行代码搞定即可搞定回测。 对于回测结果提供可视化的找到一个目前觉得比较轻量级的框架,结构简单易用,几行代码搞定即可搞定回测。 对于回测结果提供可视化的图表分析。如下图:同时提供常用的收益和风险指标数据作为量化…

【开源】Pi-hole控制面板:深入解析你的网络流量和广告拦截

今天要给大家介绍一个非常实用的开源项目——Pi-hole。这是一款基于树莓派的全能广告屏蔽助手,能够在不安装任何客户端软件的前提下为设备提供网络内容屏蔽服务,非常轻量易用。Pi-hole的主要功能: 1、 全网广告拦截: Pi-hole 充当 DNS 污水坑,阻止网络上所有设备上不需要的…