二分法&三分法
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++){ / ...
随机推荐
- 从零开始学Python第六周:面向对象基础(需修改)
标签(空格分隔): 面向对象 一,面向对象基础 (1)面向对象概述 面向过程:根据业务逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- linux下的目录结构和内容
用了这么长时间linux系统,有时候哪个文件应该在哪还是不知道的,所以对于根下的目录结构记下: /bin bin是Binary的缩写.这个目录存放着最经常使用的命令. /boot这里存放的是启动Lin ...
- Java子类属性继承父类属性
public abstract class Parent { String name = "parent"; } public class Son extends Parent{ ...
- java泛型详解
http://www.cnblogs.com/lwbqqyumidi/p/3837629.html
- HTML5中使用图片传递密文
上面的两张图片中,你能看出有什么不同吗? 右图使用 html5 canvas api 中的 getImageData 和 putImageData 函数嵌入了一段文字. 道理很简单,getImageD ...
- 操作数数据类型 ntext 对于 max 运算符无效
SoStyle.chi_description AS chi_description, SoStyle.description AS eng_description, SoStyle.chi_qual ...
- 操作DOM
操作dom一般是如下4个:更新:更新该DOM节点的内容,相当于更新了该DOM节点表示的HTML的内容:遍历:遍历该DOM节点下的子节点,以便进行进一步操作:添加:在该DOM节点下新增一个子节点,相当于 ...
- Jq基础简介
jQuery就是用原生js写出的框架集(Write less do more ) 1.需要注意的问题?(1).jQuery语法需要重新学习(2).jQuery需要注意版本之间的兼容性 (3)不是越新的 ...
- iOS 怎么设置 UITabBarController 的第n个item为第一响应者?
iOS 怎么设置 UITabBarController 的第n个item为第一响应者? UITabBarController 里面有个属性:selectedIndex @property(nonato ...
- IOS开发基础知识--碎片42
1:报thread 1:exc_bad_access(code=1,address=0x70********) 闪退 这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象( ...