int bin(int low, int high,int key,int a[]){
while(low < high){
int mid = (low + high) >> 1;
if(a[mid] < key) low = mid + 1;
else high = mid;
}
return low;
}
返回的是你要找的key的最小下标。
如果key在a数组里面没有,那么,如果key小于a里面最小的元素,则返回0;
如果key大于a里面最大的元素,则返回a的最大下标。
三分:
void thir(double low,double high){
double m1,m2;
while(low + eps < high){
m1 = (low + high) / 2.0;
m2 = (m1 + high) / 2.0;
if(cal(m1) <= cal(m2)) high = m2;
else low = m1;
}
printf("Case #%d: %d\n",ca,int(cal(low)+0.5));
}
求四边形的海伦公式。
double p = (a + b + c + d) * 1.0 / 2.0; 条件: p >= a && p >= b && p >= c && p >= d;
double area = sqrt( 1.0 * (p - a) * (p - b ) * (p - c) * (p - d) );
最大公约数:
int gcd(inta,int b)
{ return !b?a:gcd(b,a%b); }
扩展欧几里德:poj 1061 1006
int exGcd(int a, int b, int &x, int &y) {
if(b == 0) { x = 1; y = 0; return a; }
int r = exGcd(b, a % b, x, y);
int t = x;
x = y; y = t - a / b * y;
return r;
}
并查集:并查集的时候要判断一下是不是在同一个集合。
int find(int x){
return x==p[x] ? x : p[x]=find(p[x]);
}
优先队列
priority_queue <int, vector<int> ,greater <int> > q;
求x!当中含有多少factor。
for(k = factor; k <= x; k *= factor)
sum+= x/k;
其中factor是质因子,sum就是x!的该因子的个数了。