我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。|

乐池

园龄:3年4个月粉丝:0关注:7

每天一遍

1.迭代

void add(int a , int b , int c)
{
    e[idx] = b , w[idx] = c , ne[idx] = h[a] , h[a] = idx++;
}
int gcd(int a , int b)
{
    return b ? gcd(b , a%b) : a;
}

2.二分

int l = 0 , r = n - 1;
while (l < r)
{
    int mid = l + r + 1 >> 1;
    if (check(mid)) l = mid; //如果是l = mid,上面就要+1
    else r = mid - 1;
}

3.数据结构

3.1 小根堆,PII

#include <queue>
typedef pair<int , int> PII;

int main()
{
    priority_queue<PII , vector<PII> , greater<PII>> heap;
}

3.2 重载小于号

复制代码
const int N = 5e6+10;
int m;
struct Sum//定义结构体
{
    int s , c , d;
    bool operator < (const Sum &t) const
    {
        if (s < t.s) return s < t.s;
        if (c < t.c) return c < t.c;
        return d < t.d;
    }
}sum[N];

int main()
{
    for (int c......; c++)
        for (int d......; d++)
            sum[m++] = {c+d , c , d};//插入
  sort(sum , sum+m);//排序 ...... }
复制代码

 4.数学常识

4.1 如果两个数 p、q 互质

则他们不能凑出来的最大的数就是 (p - 1) * (q - 1) - 1 

比如3、5,不能凑出来的最大的数就是7

4.2 上取整

a / b 上取整,就是(a + b - 1) / b 下取整

也有一个库函数ceil,但是返回的是double 类型,需要强制转化成int,(int) ceil(a/b)

4.3 返回正余数

int get_mod(int a , int b)
{
    return (a % b + b) % b;
}

 4.4 判断8位数字是否为合法日历

复制代码
int d[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int num)
{
    int year = num / 10000;
    int month = num % 10000 / 100;
    int day = num % 100;

    if (month < 1 or month > 12 or day < 1) return false;
    if (m != 2 and day > d[m]) return false;

    if (m == 2)//判断2月的天数是否合法
    {
        int h = year % 100 and year % 4 == 0 or year % 400 == 0;//闰年为1,其余为0
        if (day > 28 + h) return false;
    }
}
复制代码

 4.5 写itoa函数,把十进制转化为a进制的数

复制代码
string itoa(int num , int a)
{
    string s;
    do{
        int t = num % a;
        if (t >= 0 and t <= 9) s += t + '0';
        else s += t - 10 + 'A';  //可以小写,看具体情况
        num /= a;
    }while (num);
    reverse(s.begin() , s.end());
    return s;
}
复制代码

atoi函数,将a进制转化为十进制

复制代码
int atoi(string s , int a)
{
    int ans = 0;
    for (int i = 0 ; i < s.size() ; i++)
    {
        char t = s[i];
        if (t <= '9' and t >= '0') ans = ans * a + t - '0';
        else ans = ans * a + t - 'A' + 10; //注意大小写
    }
    return ans;
}
复制代码

 4.6 快速幂

//求 a 的 b 次方余 p 的值
while (b)
{
    if (b & 1) res = res * 1ll * a % p;  //1ll , 方便转换成long long
    a = a * 1ll * a % p;
    b >>= 1;  //中间没有空格
}

4.7快筛法求质数

复制代码
int primes[N] , cnt;
bool st[N];

void get_primes(int n)
{
    for (int i = 2 ; i <= n ; i++)
    {
        if (!st[i]) primes[cnt ++] = i;
        for (int j = 0 ; primes[j] * i <= n ; j++)
        {    
            st[primes[j] * i] = true;
            if (i % primes[j]  == 0) break;
        }
    }
}
复制代码

 4.8 求一个数的二进制表示有多少个1

复制代码
int get_count(int x)
{
    int res = 0;
    while (x)
    {
        res++;
        x -= x & -x;
    }
}
复制代码

 

5.错误原因

1.Segmentation Fault   

很有可能是 scanf 没有加 & 取地址符

本文作者:乐池

本文链接:https://www.cnblogs.com/ratillase/p/15989534.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   乐池  阅读(69)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起