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

二分法&三分法的更多相关文章

  1. Plan & Future

    以下是OI省选前的数据结构与算法整理,可能还不是很全面.但是已经是全网相对比较全面的了.所有标记为“基础”“进阶”“中级”“提高”的知识为近些年来NOIp考察的内容,需重点掌握. 所有“高级”部分为N ...

  2. 【洛谷 p3382】模板-三分法(算法效率)

    题目:给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 解法:与二分法枚举中点使区间分成2份不一样,三分法是枚举三分点,再根据题目的情况修 ...

  3. HDU -2298 Toxophily(三分法)

    这道题目,可以推出物理公式直接来做,但是如果推不出来就必须用程序的一种算法来实现了,物理公式只是适合这一个或者某个题,但是这种下面这种解决问题的方法确实解决了一类问题 ----三分法,大家可能都听说过 ...

  4. 【题解】 [SCOI2010]传送带 (三分法)

    题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...

  5. P3382 【模板】三分法

    题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含 ...

  6. C语言两种查找方式(分块查找,二分法)

    二分法(必须要保证数据是有序排列的):   分块查找(数据有如下特点:块间有序,块内无序):    

  7. poj3122-Pie(二分法+贪心思想)

    一,题意: 有f+1个人(包括自己),n块披萨pie,给你每块pie的半径,要你公平的把尽可能多的pie分给每一个人 而且每个人得到的pie来自一个pie,不能拼凑,多余的边角丢掉.二,思路: 1,输 ...

  8. [No000087]Linq排序,SortedList排序,二分法排序性能比较

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  9. [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)

    冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...

随机推荐

  1. 一个简单的MVC实例及故障排除

    Controller: public ActionResult Index() { string setting = "ApplicationServices"; var conn ...

  2. fastq-dump 报错 解决方案

    命令行: ~/tools/sratoolkit/sratoolkit.2.3.2-5-centos_linux64/bin/fastq-dump --split-spot --gzip rhesus_ ...

  3. spring入门(六)【springMVC中各数据源配置】

    在使用spring进行javaWeb开发的过程中,需要和数据库进行数据交换,为此要经常获取数据库连接,使用JDBC的方式获取数据库连接,使用完毕之后再释放连接,这种过程对系统资源的消耗无疑是很大的,这 ...

  4. linux top命令查看内存及多核CPU的使用讲述

    查看多核CPU命令 mpstat -P ALL  和  sar -P ALL 说明:sar -P ALL > aaa.txt   重定向输出内容到文件 aaa.txt top命令 经常用来监控l ...

  5. Xdebug文档(三)堆栈跟踪

    当xdebug激活时,PHP一旦要显示通知.警告或错误时,xdebug 显示堆栈跟踪信息.这个堆栈信息能跟据你的需要来配置显示. Xdebug显示的堆栈跟踪都是以保守数量状态显示信息.因为大量的信息处 ...

  6. js圣诞节倒计时网页

    在线预览:http://keleyi.com/keleyi/phtml/jstexiao/17.htm 以下是代码: <!DOCTYPE html> <html xmlns=&quo ...

  7. 简单介绍JSON

    如下图:

  8. 关于webStrom-11.1配置less且自动生成.css和自动压缩为.min.css/.min.js

    网上看过很多配置思路,自己总结了以下, 就把我个人配置的顺序以及材料分享下,webstrom以下简称WB 1.配置less需要安装nodejs,自行安装.因为要用到npm.我是直接把npm解压到C盘根 ...

  9. C#登入例子--第一个程序

    第一步:在数据库创建一个存放账号密码的表单 第二步:创建一个登入项目 拆分成三层: CS层: BLL层: DAL层: Common层: Web.config:

  10. JS事件-让网页交互

    什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...