一些小东西- 二分,海伦公式,最大公约数,扩展欧几里德,并查集,优先队列,求x!中p的个数

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!的该因子的个数了。
 

你可能感兴趣的:(一些小东西- 二分,海伦公式,最大公约数,扩展欧几里德,并查集,优先队列,求x!中p的个数)