noi题库(noi.openjudge.cn) 1.11编程基础之二分查找T01、02、04
T01 查找最接近的元素
描述
在一个非降序列中,查找与给定值最接近的元素。
输入
第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。
第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。
第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。
接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间。
输出
m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。
样例输入 样例输出
样例
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,a[],m,x;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d",&x);
int l=,r=n,mid,cha=,ans;//cha为当前最小的差的绝对值,ans为得出cha的序列元素
while(l<=r)
{
mid=(l+r)/;
int h=abs(a[mid]-x);//x与当前查找到的元素的差的绝对值
if(!h) //h=0,说明原序列中有x
{
ans=a[mid];
break;
}
else if(a[mid]<x) l=mid+;//中点比x小,往右找
else r=mid-; //中点比x大,往左找
if(h<cha) ans=a[mid],cha=h;
else if(h==cha&&ans>a[mid]) ans=a[mid];//若有多个满足条件,输出最小的一个
}
printf("%d\n",ans);
}
}
交了5遍过的,2个问题:
1、序列元素与差值混了
2、错误的认为二分出来的同等差值的第一个一定是最小的一个
T02 二分法求函数的零点
描述
有函数:
f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121
已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,请用二分法求出该根。
输入
无。
输出
该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。
样例输入
无
样例输出
不提供
样例
因为f(1.5) > 0 , f(2.4) < 0且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,所以函数在区间[1.5,2.4]内单调递减
先将区间中点带入,若小于0,则此区间中点位于零点右侧,所以要向左找;若大于0,则此区间中点为于零点左侧,所以要向右找
#include<iostream>
#include<cstdio>
using namespace std;
double l=1.5,r=2.4,,xx;
double work(double x)
{
return x*x*x*x*x-*x*x*x*x+*x*x*x-*x*x+*x-;
}
int main()
{
while(r-l>=0.000001)
{
xx=(l+r)/;
if(work(xx)<=) r=xx;
else l=xx;
}
printf("%.6lf",xx);
}
做的时候跟曾经做过的一元三次方程求解那道题混了,一元三次方程求解2001年NOIP全国联赛提高组
T04 网线主管
描述
仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑结构连接在一起,即将它们全部连到一个单一的中心服务器。为了组织这个完全公正的比赛,裁判委员会主席提出要将所有选手的电脑等距离地围绕在服务器周围放置。
为购买网线,裁判委员会联系了当地的一个网络解决方案提供商,要求能够提供一定数量的等长网线。裁判委员会希望网线越长越好,这样选手们之间的距离可以尽可能远一些。
该公司的网线主管承接了这个任务。他知道库存中每条网线的长度(精确到厘米),并且只要告诉他所需的网线长度(精确到厘米),他都能够完成对网线的切割工作。但是,这次,所需的网线长度并不知道,这让网线主管不知所措。
你需要编写一个程序,帮助网线主管确定一个最长的网线长度,并且按此长度对库存中的网线进行切割,能够得到指定数量的网线。
输入
第一行包含两个整数N和K,以单个空格隔开。N(1 <= N <= 10000)是库存中的网线数,K(1 <= K <= 10000)是需要的网线数量。
接下来N行,每行一个数,为库存中每条网线的长度(单位:米)。所有网线的长度至少1m,至多100km。输入中的所有长度都精确到厘米,即保留到小数点后两位。
输出
网线主管能够从库存的网线中切出指定数量的网线的最长长度(单位:米)。必须精确到厘米,即保留到小数点后两位。
若无法得到长度至少为1cm的指定数量的网线,则必须输出“0.00”(不包含引号)。
样例输入 8.02
7.43
4.57
5.39
样例输出
2.00
样例
本题一定要特别注意精度问题,在输入时,把每个输入的数*100之后在存储,输出时/100输出,否则只能得8分
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int a[];
double ans;
double x;
bool ok(int k)
{
int s=;
for(int i=;i<=n;i++)
s+=a[i]/k;
if(s<m) return false;
else return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%lf",&x);
a[i]=x*;
}
int l=,r=;//最大值100km,即10000000cm,可以稍微大一点。r还可以赋值为只看输入数据中的最大值,这样只需要在输入时记录一个max,把max复制给r
while(l<=r)
{
int mid=(l+r)/;
if(ok(mid)) ans=mid,l=mid+;
else r=mid-;
}
ans=ans/;
if(ans<0.01) printf("0.00");
else printf("%.2lf",ans);
}
交了28遍才过,总之就是没有发现2个问题:
1、精度问题,没有把输入数据*100在计算,直接按double算的
2、赋值r的时候,一直想着r的最大值是所有网线长度总和再除以需要的网线数量,忽略了有的网线可以不用,这就拉低了最大值,实际上r的最大值应为所有网线长度中的最大值
noi题库(noi.openjudge.cn) 1.11编程基础之二分查找T01、02、04的更多相关文章
- noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T01——T05
T01 查找特定元素的值 描述 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置. 输入 第一行包含一个正整数n,表示序列中元素个数.1 <= n <= 10000.第二 ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- NOI题库 1768最大子矩阵 题解
NOI题库 1768最大子矩阵 题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...
- NOI题库 09:图像旋转翻转变换
NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...
- NOI题库-小学奥赛QwQ
今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- C++11写算法之二分查找
同样的,二分查找很好理解,不多做解释,要注意二分查找的list必须是排好序的. 这里实现了两种二分查找的算法,一种递归一种非递归,看看代码应该差不多是秒懂.想试验两种算法,改变一下findFunc函数 ...
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35
T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...
- noi题库(noi.openjudge.cn) 1.5编程基础之循环控制T36——T45
T36 计算多项式的值 描述 假定多项式的形式为xn+xn-1+-+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值. 输入 输入仅一行,包括x和n,用单个空格隔开.x在flo ...
随机推荐
- OcLint的使用
一.介绍 OCLint是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对c,c++和Objective-c的静态分析.功能非常强大,而且是出自国人之手.项目地址:http: ...
- frist Django app — 一、 创建工程(转载)
转载地址:https://www.cnblogs.com/sunshine-2015/p/5658283.html 缘起 既然python都学了,学习python的时候感觉是相见恨晚,一种新的编程语言 ...
- pycharm安装jpype报错及解决方法
安装jpype时发生报错: 按照提示去装了Microsoft visual C++,结果重新安装还是报错,根据https://blog.csdn.net/qq_38934189/article/det ...
- 理解RESTful架构【转】
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- Idea(三)常用插件以及快捷键总结
idea常用插件以及快捷键 现在开发中和日常自己开发都统一换成了idea进行开发了.现在针对自己常用到的插件和快捷键进行总结记录下. 插件 Alibaba Java Coding Guidelines ...
- CKEditor 4 & markdown & rich text editor
CKEditor 4 ckeditor 4 http://ckeditor.com
- 对synchronized的一点理解
一.synchronized的使用(一).synchronized同步方法1. “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题.2. 如果多个线程共同访问 ...
- [二十七]SpringBoot 之 Restful接口的跨域请求
什么是跨域 简单的说即为浏览器限制访问A站点下的js代码对B站点下的url进行ajax请求.比如说,前端域名是www.abc.com,那么在当前环境中运行的js代码,出于安全考虑,访问www.xyz. ...
- linux shell 执行命令顺序
1.shell命令搜索顺序 在linux shell 中输入一个命令,如果有多个同名指令,shell需要按照一定规则去取优先级高的一个执行,shell命令的搜索顺序为: 1.别名,使用alias创建的 ...
- 使用URLConnection发送http请求实现简单爬虫(可以配置代理)
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...