Binary search ( v.begin (),v.end(),3,function)
二分法查找
// binary_search example
#include <iostream> // std::cout
#include <algorithm> // std::binary_search, std::sort
#include <vector> // std::vector
boolmyfunction (
inti,
intj) {
return(i<j); }
int main () {
int
myints[] = {1,2,3,4,5,4,3,2,1};
std::vector<
int> v(myints,myints+9);
// 1 2 3 4 5 4 3 2 1
// using default comparison:
std::sort (v.begin(), v.end());
std::cout <<
"looking for a 3... ";
if
(std::binary_search (v.begin(), v.end(), 3))
std::cout <<
"found!\n";
elsestd::cout <<
"not found.\n";
// using myfunction as comp:
std::sort (v.begin(), v.end(), myfunction);
std::cout <<
"looking for a 6... ";
if
(std::binary_search (v.begin(), v.end(), 6, myfunction))
std::cout <<
"found!\n";
elsestd::cout <<
"not found.\n";
return
0;
}
Lower-bound 地址查找
Upper-bound
// lower_bound/upper_bound example
#include <iostream> // std::cout
#include <algorithm> // std::lower_bound, std::upper_bound, std::sort
#include <vector> // std::vector
int main () {
int
myints[] = {10,20,30,30,20,10,10,20};
std::vector<
int> v(myints,myints+8);
// 10 20 30 30 20 10 10 20
std::sort (v.begin(), v.end());
// 10 10 10 20 20 20 30 30
std::vector<
int>::iterator low,up;
low=std::lower_bound (v.begin(), v.end(), 20);
// ^
up= std::upper_bound (v.begin(), v.end(), 20);
// ^
std::cout <<
"lower_bound at position "<< (low- v.begin()) <<
'\n';
std::cout <<
"upper_bound at position "<< (up - v.begin()) <<
'\n';
return
0;
}
Output
looking for a 3... found!
looking for a 6... not found.
都是有一个容器存储的,然后去进行查找 ,
/*
HDU4282 A very hard mathematic problem
Coded by Guojin Zhu
Run time 125MS
AC on September 10, 2012
-----------------
INPUT
9
53
6
0
------------------
OUTPUT
1
1
0
*/
#include<iostream>
#include<cmath>
using namespace std;
/
const double eps = 0.0000001;
class SearchX{//X^Z + Y^Z + XYZ = K => y^z < k => y < k^(1/z)
public: //X^Z + Y^Z + XYZ - K = 0 => f(x) = x^c + b + x*a = 0
double a; // a = y*z
double b; // b = y^z - k
int c; // c = z
bool binary_search(int left, int right);
};
bool SearchX::binary_search(int left, int right){
if(left > right){
return false;
}else{
int mid = (left + right) >> 1;
double p = pow(double(mid), c) + a*double(mid) + b;//p = f(x)
if(abs(p) < eps){//p = 0 ?
return true;
}else if(p > 0){
return binary_search(left, mid - 1);
}else{
return binary_search(mid + 1, right);
}
}
}
class HardProblem{
private:
int k;
int cnt;
public:
void initial(int a){k = a; cnt = 0;}
void computing();
void outResult(){cout << cnt << endl;}
};
void HardProblem::computing(){
SearchX sx;
int maxy;
for(int z = 2; z < 32; z++){
maxy = int(eps+ pow(double(k), 1.0/double(z)));
for(int y = 2; y <= maxy; y++){
sx.a = double(y*z);
sx.b = pow(double(y), z) - double(k);
sx.c = z;
if(sx.binary_search(1, y-1)){
cnt++;
}
}
}
}
/
int main(){
HardProblem hp;
int k;
while((cin >> k) && k){
hp.initial(k);
hp.computing();
hp.outResult();
}
return 0;
}
这种情况没有容器,只能靠自己写binary search 的函数去运行。。