二分法&三分法
ural History Exam 二分
#include <iostream>
#include <cstdlib>
using namespace std; //二分查找
bool binarySearch(long a[], long x, int n){
int left = ,right = n-;
int middle;
while (left <= right){
middle = (left+right)/;
if (x == a[middle]) return ;
if (x > a[middle]) left = middle + ;
else right = middle - ;
}
return ;
} int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
} int main(){
int numprofessor;
scanf("%ld",&numprofessor); long yearProfessor[numprofessor];
for(int i=;i<numprofessor;i++){
scanf("%ld",&yearProfessor[i]);
} qsort(yearProfessor,numprofessor,sizeof(long),cmp);
long numstudent;
scanf("%ld",&numstudent); long result=; long yearstudent[numstudent];
for(int i=;i<numstudent;i++){
scanf("%ld",&yearstudent[i]);
if( binarySearch(yearProfessor, yearstudent[i], numprofessor)){
result++;
} } cout<<result; }
二分
ural Fibonacci Sequence
第一遍用递归写,结果在数据比较大时,超时了。题目要求1000ms,测试结果是1029ms,代码如下:
#include <iostream>
using namespace std; int i,j,fi,fj,n;
int count=,count1=,count2=;
int finext; // 表示fi下一个f(i+1)的值 int fib1(int j){ /*递归程序1:计算fj时用到的fi和finext的次数 */
if(j==i){
count1++; //记录fi用到的次数
return ;
}
if(j==i+){
count2++; //记录finext用到的次数
return ;
}
return fib1(j-) + fib1(j-);
} long fib3 (int n){
//* 迭代解法:这里算法复杂度显然为O(n) ,
// 这个解法目前来看是最好的解法,算法既不复杂,而且在时间复杂度和空间复杂度上都有保证
if(n==i){
return fi;
}
if(n==i+){
return finext;
}
long long x = fi, y = finext;
for (int a= i; a<n-; a++){
y = x + y;
x = y - x;
}
return y;
} int main(){
cin>>i>>fi>>j>>fj>>n;
if(j<i){
int temp=j,temp1=fj;
j=i;
fj=fi;
i=temp;
fi=temp1;
}
int a=fib1(j);
finext=(fj-count1*fi)/count2;
cout<<fib3(n)<<endl; }
回想了一下最近学习的二分法,发现暴力枚举后得二分优化,貌似可以过,遂有下代码:
#include <iostream>
using namespace std; const long long NLAR = ;
long long i,fi,j,fj,n; int main(){
cin >> i >> fi >> j >> fj >> n;
if(j<i){ //保证j>i
int temp=j,temp1=fj;
j=i;
fj=fi;
i=temp;
fi=temp1;
} // cal f[i+1] long long left=-NLAR, right=NLAR, mid;
long long ti=fi, tj=mid, t;
while (left+<right){
mid = (left+right)/;
ti=fi; tj=mid;
for (int k=i+; k<=j; ++k){
t=ti+tj;
ti=tj;
tj=t;
if(t>NLAR* ||t<-NLAR*) break;
}
if(tj>=fj) right = mid;
else left=mid;
} ti=fi; tj=right;
if(n>i){
for(int k=i+;k<=n;++k){
t=ti+tj;
ti=tj;
tj=t;
}
cout << tj << endl;
}
else {
for(int k=i-; k>=n; ++k){
t=tj-ti;
tj=ti;
ti=t;
}
cout << ti << endl;
} return ;
}
三分法主要求解单峰函数极值,
ural Bookshelf
本题目中要求的函数的图像(取H=6,h=1)为:可以看出这是一个单峰函数,可以运用三分法求极值。

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <cmath>
using namespace std;
#define EPS 1e-9 int h,H,L;
double fx(double x){
return H/2.0*x/sqrt(h*h+x*x)-x;
} int main(){
cin>>h>>H>>L;
double left=,right=H;
long double isover=; while(isover>EPS){
double m1=left+(right-left)/;
double m2=right-(right-left)/; double fm1=fx(m1);
double fm2=fx(m2); if(fm1<fm2) left=m1;
else right=m2;
isover=right-left;
}
cout<<fixed<<setprecision()<<fx(right)<<endl;
}
这里再收录一个关于二分法的课堂例题,poj1064
/*
* poj-1064 Cable master.cpp
* 二分, 化为整数存储,下界为1(cm),上界为最长绳的长度
*
*/
#include<cstdio>
using namespace std; const double eps = 1e-; //注意精度
const int maxn = + ; int n, k, cable[maxn]; int main(){
scanf("%d%d", &n, &k);
double ftmp;
int tmpMax = ;
for(int i=; i<n; i++){
scanf("%lf", &ftmp);
cable[i] = int((ftmp+eps) * ); //精度 if(cable[i] > tmpMax) tmpMax = cable[i];
} int up = tmpMax, low = , mid = -, ans = -;
int tmpNum = ;
while(low <= up){
mid = (up + low) / ;
tmpNum = ;
for(int i=; i<n; i++)
tmpNum += cable[i] / mid; if(tmpNum >= k){
if(mid > ans) ans = mid;
low = mid + ;
}
else
up = mid - ;
} if(ans < )
printf("0.00\n");
else
printf("%.2lf\n", ans * 0.01); return ;
}
poj1064
二分法&三分法的更多相关文章
- Plan & Future
以下是OI省选前的数据结构与算法整理,可能还不是很全面.但是已经是全网相对比较全面的了.所有标记为“基础”“进阶”“中级”“提高”的知识为近些年来NOIp考察的内容,需重点掌握. 所有“高级”部分为N ...
- 【洛谷 p3382】模板-三分法(算法效率)
题目:给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 解法:与二分法枚举中点使区间分成2份不一样,三分法是枚举三分点,再根据题目的情况修 ...
- HDU -2298 Toxophily(三分法)
这道题目,可以推出物理公式直接来做,但是如果推不出来就必须用程序的一种算法来实现了,物理公式只是适合这一个或者某个题,但是这种下面这种解决问题的方法确实解决了一类问题 ----三分法,大家可能都听说过 ...
- 【题解】 [SCOI2010]传送带 (三分法)
题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...
- P3382 【模板】三分法
题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含 ...
- C语言两种查找方式(分块查找,二分法)
二分法(必须要保证数据是有序排列的): 分块查找(数据有如下特点:块间有序,块内无序):
- poj3122-Pie(二分法+贪心思想)
一,题意: 有f+1个人(包括自己),n块披萨pie,给你每块pie的半径,要你公平的把尽可能多的pie分给每一个人 而且每个人得到的pie来自一个pie,不能拼凑,多余的边角丢掉.二,思路: 1,输 ...
- [No000087]Linq排序,SortedList排序,二分法排序性能比较
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...
- [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)
冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...
随机推荐
- N皇后问题
题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...
- tomcat启动时候报错Can't convert argument: null
一.启动报错: 为了避免导入的项目重名,我先修改了前一个项目的名称. 重新启动该项目至tomcat,报错:java.lang.IllegalArgumentException: Cant conver ...
- 4、python列表
1.末尾追加:append() s = ["a", "b", "c"] print(s) #['a', 'b', 'c'] s.append ...
- JSON总结(java篇)
JSON总结(java篇一) JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于 ...
- ABP之模块分析
本篇作为我ABP介绍的第三篇文章,这次想讲下模块的,ABP文档已经有模块这方面的介绍,但是它只讲到如何使用模块,我想详细讲解下它模块的设计思路. ABP 框架提供了创建和组装模块的基础,一个模块能够依 ...
- ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- 从头开始搭建分布式日志平台的docker环境
上篇(spring mvc+ELK从头开始搭建日志平台)分享了从头开始搭建基于spring mvc+redis+logback+logstash+elasticsearch+kibana的分布式日志平 ...
- 纯HTML+CSS带说明的黄色导航菜单
HoverTree带说明的CSS菜单:纯HTML+CSS结构链接带说明的黄色导航 在线体验效果:http://hovertree.com/texiao/css/1.htm 代码如下,保存到HTML文件 ...
- 轻松掌握:JavaScript观察者模式
观察者模式 观察者模式也叫"订阅者/发布者"模式,定义对象间的一种一对多的依赖关系,发布者可以向所有订阅者发布消息. 观察者模式被广泛地应用于JavaScript客户端编程中.所有 ...
- SharePoint 2013 工作流之年假审批Designer配置篇
本文介绍SharePoint 2013 使用Designer工具,设计年假审批工作流,由于流程所用的条件和操作都比较简单,所以演示为主,最后附流程图和流程的文本图,有兴趣的可以参照实验.如果对于Des ...