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;