热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2019年寒假强化训练:二分算法深度解析与实战演练

在2019年寒假强化训练中,我们深入探讨了二分算法的理论与实践应用。问题A聚焦于使用递归方法实现二分查找。具体而言,给定一个已按升序排列且无重复元素的数组,用户需从键盘输入一个数值X,通过二分查找法判断该数值是否存在于数组中。输入的第一行为一个正整数,表示数组的长度。这一训练不仅强化了对递归算法的理解,还提升了实际编程能力。

问题 A: 【递归】二分查找

题目描述

用递归算法实现二分查找,即:有n个已经从小到大排序好的数据(不重复),从键盘输入一个数X,用对半查找方法,判断它是否在这n个数中。

输入

第一行,正整数n,N<=105;

第二行,n个整数(int范围内,不重复),中间用空格分隔;

第三行,整数X。

输出

如果找到X,输出其位置;否则输出-1。

样例输入


10
10 20 30 40 50 60 70 80 90 100
90

样例输出


9

代码:


#include
using namespace std;
int ans=-1;
int a[100005];
int b,n;
void find(int,int);
int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i];cin>>b;find(1,n);cout<}
void find(int x,int y)
{int mid=(x+y)/2;if(a[mid]==b) {ans=mid;return;} else if(x>y)return;else {if(a[mid]b)find(x,mid-1);}
}

问题 C: 循环比赛日程表

题目描述

设有n个选手进行循环比赛,其中n = 2^m,要求每名选手要与其他n - 1名选手都赛一次,每名选手每天比赛一次,循环赛共进行n - 1天,要求每天没有选手轮空。

输入

一行,包含一个正整数m。( 1 <= m <= 10)

输出

表格形式的比赛安排表(n行n列),每个选手的编号占三个字符宽度,右对齐。

样例输入


3

样例输出

1 2 3 4 5 6 7 82 1 4 3 6 5 8 73 4 1 2 7 8 5 64 3 2 1 8 7 6 55 6 7 8 1 2 3 46 5 8 7 2 1 4 37 8 5 6 3 4 1 28 7 6 5 4 3 2 1

题解:

分治算法

以表格的中心为拆分点,将表格分成A、B、C、D四个部分,就很容易看出有A=D,B=C,并且,这一规律同样适用于各个更小的部分。


#include
const int MAXN=65;
using namespace std;
int n,matchlist[MAXN][MAXN];
void makelist(int a1,int b1,int a2,int b2,int x,int y)
{if(x==y)matchlist[a1][b1]=x;else{int a3=(a1+a2)/2;int b3=(b1+b2)/2;int xy=(x+y)/2;makelist(a1,b1,a3,b3,x,xy);makelist(a1,b3+1,a3,b2,xy+1,y);makelist(a3+1,b1,a2,b3,xy+1,y);makelist(a3+1,b3+1,a2,b2,x,xy);}
}
void print(int n)
{for(int i=1;i<=n;i++){for(int j=1;j}
int main()
{cin>>n;n=1<}

问题 D: 愤怒的牛

题目描述

原题来自:USACO 2005 Feb. Gold

农夫约翰建造了一座有 nn 间牛舍的小屋,牛舍排在一条直线上,第 ii 间牛舍在 x_ixi 的位置,但是约翰的 mm 头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。

牛们并不喜欢这种布局,而且几头牛放在一个隔间里,它们就要发生争斗。为了不让牛互相伤害。John 决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是多少呢? 

输入

第一行用空格分隔的两个整数 n 和 m; 

第二行为 n个用空格隔开的整数,表示位置 xi。  

输出

输出仅一个整数,表示最大的最小距离值。

样例输入


5 3
1 2 8 4 9

样例输出


3

样例解释

把牛放在 1, 4 ,8这样最小距离是 3 。 

题解:

二分两头牛之间的最小的最大距离,然后在check函数中检查答案是否合法

代码:


#include
const int MAXN=100005;
using namespace std;
int n,m;
int x[MAXN];
int check(int num)
{int cow=1,sum=x[1]+num;for(int i=2;i<=n;i++){if(x[i]=m)return 1;else return 0;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)cin>>x[i];sort(x+1,x+1+n);int mid,l=0,r,ans;r=x[n]-x[1];while(l<=r){mid=(l+r)/2;if(check(mid)==1){l=mid+1;ans=mid;}else r=mid-1;}cout<}

问题 E: Best Cow Fences

题目描述

原题来自:USACO 2003 Mar. Green

给定一个长度为 n 的非负整数序列 A,求一个平均数最大的,长度不小于 L 的子段。 

输入

第一行用空格分隔的两个整数 n和 L; 

第二行为 n个用空格隔开的非负整数,表示 Ai。 

输出

输出一个整数,表示答案的 10001000 倍。不用四舍五入,直接输出。

样例输入


10 6
6 4 2 10 3 8 5 9 4 1

样例输出


6500

题解:

二分+前缀和优化

二分一个平均数,然后检查答案

怎么检查答案:

如果一个子串的平均数大于二分的平均数,那么可以理解为找到一个子串,

子串的和非负,可以用前缀和优化一下

代码:


#include
#define INF 1<<30
using namespace std;
int n,L;
double a[100010],sum[100010];
bool check(double mid)
{for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i]-mid;double minn=INF,ans=-INF;for(int i=L;i<=n;i++){minn=min(minn,sum[i-L]);ans=max(ans,sum[i]-minn);}return ans>=0.0;
}
int main()
{cin>>n>>L;memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++) cin>>a[i];double l=-1e6,r=1e6;while(r-l>1e-5){double mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}cout<}

 


推荐阅读
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 解题心得:UVA1339(逻辑分析与字符串处理+排序算法)
    解题心得:UVA1339(逻辑分析与字符串处理+排序算法) ... [详细]
  • 题目链接: Caninepoetry问题概述:给定一个仅包含小写字母的字符串,允许将任意位置的字符修改为任意其他小写字母。目标是通过最少次数的修改,使字符串中所有长度大于1的子串均满足特定条件。本文详细分析了该问题,并运用思维与贪心算法,提出了一种高效解决方案。通过对字符串的深入解析,我们探讨了如何在最小化修改次数的同时,确保所有子串符合要求。 ... [详细]
  • 本文深入解析了 Kuangbin 数学训练营中的经典问题——Ekka Dokka,并通过详细的代码示例和数学推导,探讨了该问题的多种解法及其应用场景。通过对算法的优化和扩展,本文旨在为读者提供全面的理解和实用的参考。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文深入探讨了佩尔方程 \( x^2 - dy^2 = 1 \) 的递推关系式。通过构造特定的矩阵并利用矩阵快速幂的方法,可以高效地计算出该方程的第 k 组解。此外,文章还详细分析了递推关系式的数学背景及其在数论中的应用,为相关研究提供了坚实的理论基础。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
  • 本文探讨了在硬币找零问题中使用枚举法的具体应用。具体而言,题目要求将一定数额的零钱换成5分、2分和1分的硬币,并且每种硬币至少需要使用一枚。研究旨在找出所有可能的换法组合。输入数据为一行,包含一个在8到100之间的整数,表示待换的零钱数额。通过详细的枚举分析,本文提供了高效的解决方案,并验证了其在实际应用中的可行性和有效性。 ... [详细]
  • 图论入门基础教程
    图论是计算机科学和数学中的重要分支,本教程旨在为初学者提供全面的基础知识。通过实例解析,如“昂贵的聘礼”问题,讲述了一个年轻探险家在印第安部落与酋长女儿的爱情故事,展示了图论在解决实际问题中的应用。教程内容涵盖了图的基本概念、表示方法以及常见算法,适合各类读者学习。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
author-avatar
yzkgt18688161
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有