问题 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<iostream>
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<<ans<<endl;return 0;
}
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(mid+1,y);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<bits/stdc++.h>
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<n;j++)printf("%3d",matchlist[i][j]);printf("%3d\n",matchlist[i][n]);}
}
int main()
{cin>>n;n=1<<n;makelist(1,1,n,n,1,n);print(n);return 0;
}

问题 D: 愤怒的牛

题目描述

原题来自:USACO 2005 Feb. Gold

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

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

输入

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

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

输出

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

样例输入

5 3
1 2 8 4 9

样例输出

3

样例解释

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

题解:

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

代码:

#include<bits/stdc++.h>
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]<sum)continue;cow++;sum=x[i]+num;}if(cow>=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<<ans<<endl;
}

问题 E: Best Cow Fences

题目描述

原题来自:USACO 2003 Mar. Green

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

输入

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

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

输出

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

样例输入

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

样例输出

6500

题解:

二分+前缀和优化

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

怎么检查答案:

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

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

代码:

#include<bits/stdc++.h>
#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<<int(r*1000)<<endl;
}

2019年寒假集训-二分专题相关推荐

  1. #2020寒假集训#二分入门(Binary Search)代码笔记

    二分查找--Binary Search 原理就类似于下图啦(网上看到哒,忽略这个代价) 二分的时间复杂度一般是 O(logN) 的,超开心了有木有٩(๑>◡<๑)۶ 最简单来说,它可以分为 ...

  2. 2019寒假集训新生考试

    序言: 为期一周的欢乐的寒假集训终于结束了,很高兴能认识这么多的大佬和学长.学姐.很感谢ljw学长和陈宇老师为我们寒假培训所作出的贡献. 简单点评一下今天的考试试题,就在比赛前的中午,jlw学长说题目 ...

  3. 2019寒假集训新生考试 【持续更新中】

    2019寒假集训新生考试-NEFU 0107 emoji表情包 Problem A nefu 2101 28的因子 ⭐️ 本题使用暴力枚举,统计n可以分成几个4和7, 为了防止TLE ,先统计4的个数 ...

  4. 2019/1/30 寒假集训总结

    从一月16号到一月29号为期两周的寒假集训已经结束了,说实话,从一开始认真对待,到最后几天出现了松懈,但仍然坚持下来.总是感觉这次集训自己做了很大的努力,直到昨天看见老费发的一篇关于去参加CCPC   ...

  5. 2023寒假集训通知

    各位家长,各位同学,新年好! 过去的2022是我们编程学习,算是比较成功的一年.大家跟着我们的团队进行了约一年的培训,很有收获.纵观全年: 1.寒假我们认真集训了24天 2.三四月间参加了人工智能学会 ...

  6. 寒假集训总结 (1.23~1.28) [第一梯队]

    Day 1. 分治算法入门 一.分治法概述 分治法的设计思想 对于一个规模为 n n n的问题:若该问题可以容易地解决(比如说规模 n n n较小)则直接解决,否则将其分解为 k k k个规模较小的子 ...

  7. DP\记忆化搜索-牛客寒假集训营3-牛牛的DRB迷宫I

    DP-牛客寒假集训营3-牛牛的DRB迷宫I 题目: 题意: 求迷宫问题的方案数量.与--求迷宫问题的方案数量.与--求迷宫问题的方案数量.与--DP题型总结中的<摘花生>类似.中的< ...

  8. 构造-牛客寒假集训营3-牛牛的DRB迷宫II

    构造-牛客寒假集训营3-牛牛的DRB迷宫II 题目: 题意: 输入一个数字,表示从起点(1,1)到终点(n,m)的方案数量,输出满足条件的迷宫.输入一个数字,表示从起点(1,1)到终点(n,m)的方案 ...

  9. 关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训)

    关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训) 题目: 链接:https://ac.nowcoder.com/acm/contest/3004/B 来源:牛客网 题目描述 ...

最新文章

  1. jsp+ajax+servlet+sqlserver实现分页查询_SXT DAY063 分页
  2. CSSOM之getComputedStyle,currentStyle,getPropertyValue,getAttribute
  3. 软键盘挡住输入框问题的终极解决方案
  4. string[x]:size 属性具有无效大小值0
  5. 《Java从入门到放弃》JavaSE入门篇:文件操作
  6. chrome浏览器断点调试js代码 和 idea断点调试java代码
  7. jpa 定义中间表实体_JPA系列之-带你快速掌握JPA
  8. 阿里旺旺2012自动登录
  9. 服务器协议密码,Radius协议 - 如何将密码发送到服务器?
  10. macOS 开发 - Move to Applications folder
  11. 微信技术总监:一亿用户背后的架构秘密
  12. 下载网页中不能下载的pdf
  13. 16进制图片数据转JPG格式和BMP格式
  14. 阿里云SLB最佳实践
  15. OpenCV 画任意圆弧曲线
  16. Android安卓开发基础-Button与ImageButton
  17. oracle 设置序列的值
  18. 风速与风力等级关系 Python
  19. 2021浙江理工大学新生赛被毒打记录
  20. IOS开发教程第一季之03多线程day3--最大并发数,队列的暂停,取消和恢复、操作优先级、线程监听、多线程下UITableView显示图片案例

热门文章

  1. ubuntu上打开markdown文件
  2. 糗百新鲜事——爬虫python
  3. 微信公众号赞赏账户头像在哪里修改?附详细图文教程
  4. Array Vlink的应用
  5. 2023 年 5 大人工智能 (AI) 趋势
  6. 路由器被蹭网后,我有被黑的风险吗?
  7. SvnAnt authentication cancelled 的解决
  8. UNIX Time Sharing System - UNIX分时系统翻译
  9. linux 显示bin 文件格式,bin文件扩展名,bin文件怎么打开?
  10. 华泰单因子测试之换手率类因子