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

来源:互联网 发布:大ip什么意思网络用语 编辑:程序博客网 时间:2024/04/28 21:21
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!的该因子的个数了。
 

原创粉丝点击