cpp手册-基础知识

cpp手册

一、基础知识

1. 简介

竞争性编程Competitive programming 结合了两个主题:
1)算法设计 the design of algorithms 和
2)算法的实现 the implementation of algorithms。

1. 算法的设计
  包括问题解决problem solving 和数学思维mathematical thinking。
  需要有  analyzing problems分析问题 和 创造性地解决问题的技巧。
  用于解决问题的算法必须是正确且有效的,并且问题的核心通常是发明有效的算法。
  算法的理论知识Theoretical knowledge 对竞争程序员很重要。
  通常,问题的解决方案是 众所周知的技术 和 新见解new insights  的组合。
  竞争性编程中出现的技术也构成了算法科学研究的基础。
  
2. 算法的实现
  需要良好的 编程技能programming skills 。
  在竞争性编程中,通过测试已实施的方案对解决方案进行评级算法使用一组测试用例。
  因此,算法的思想是正确的是不够的,但实现也必须是正确的。
  比赛中良好的编码风格简洁明了。应该快速编写程序,因为没有太多时间可用。
  不同于传统的软件工程,程序很短(通常最多几百行代码),并且在比赛后不需要维护maintained。  

c++ python java

输入输出

int a, b;
string x;
cin >> a >> b >> x; // 输入 c function  scanf("",&)  ; scanf("%d %d", &a, &b);
>>> 123 456 monkey

int a = 123, b = 456;
string x = "monkey";
cout << a << " " << b << " " << x << "\n";// 输出 c function  printf("",) ; printf("%d %d\n", a, b);

string s;
getline(cin, s);  // 读取一整行

// 输入数据量未知====
while (cin >> x) {
    // code
}

// 文件 
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);


数字

// integers 整数=======================
long long x = 123456789123456789LL; // 后缀suffix 
int a = 123456789;
long long b = a*a; // 错误,溢出
cout << b << "\n"; // -1757895751
// 正确
long long b = (long long)a*a; // 强制转换,static_cast<long long>(a*a) 


//=========================
// 取余技术
(a + b) mod m = (a mod m + b mod m) mod m
(a − b) mod m = (a mod m − b mod m) mod m
(a * b) mod m = (a mod m * b mod m) mod m // 可以直接展开

// 计算n的阶乘 取余 m
long long x = 1;
for (int i = 2; i <= n; i++) 
{
  x = (x*i)%m;
}
cout << x%m << "\n";// 最后再取余m


// 浮点数 Floating point numbers==========
printf("%.9f\n", x);
double x = 0.3*3+0.1;
printf("%.20f\n", x); // 0.99999999999999988898

// 浮点数判等
if (abs(a-b) < 1e-9) 
{
     // a 和 b 相等
}

缩短代码技术 Shortening code

// typedef 起外号=======类别别名==========
typedef long long ll; // 起小名,外号,好记,好写

//long long a = 123456789;
//long long b = 987654321;
ll a = 123456789;
ll b = 987654321;

cout << a*b << "\n";

// 复杂类型 重命名  后面为简写 =======================
typedef vector<int> vi;   // 整形 向量   后面为简写
typedef pair<int,int> pi; // 整形-整形 数据对


// #define 宏macros定义  前面为简写==================
#define F first   // 前面为简写
#define S second
#define PB push_back
#define MP make_pair

v.push_back(make_pair(y1,x1));
v.push_back(make_pair(y2,x2));
int d = v[i].first+v[i].second;

// ====>
v.PB(MP(y1,x1));
v.PB(MP(y2,x2));
int d = v[i].F+v[i].S;

// 接收参数的宏
#define REP(i,a,b) for (int i = a; i <= b; i++) // 简化 for循环 repare

for (int i = 1; i <= n; i++) 
{
  search(i);
}
// ====>
REP(i,1,n) 
{
  search(i);
}

// 一些宏导致的错误,较难发现
#define SQ(a) a*a
cout << SQ(3+3) << "\n";
cout << 3+3*3+3 << "\n"; // 15 
// 正确方式
#define SQ(a) (a)*(a)
cout << SQ(3+3) << "\n";
cout << (3+3)*(3+3) << "\n"; // 36

数学

1 + 2 +,...,+ n = n(n+1)/2
1^2 + 2^2 +,...,+ n^2 = n(n+1)(2n+1)/6
1^3 + 2^3 +,...,+ n^3 = n^2(n+1)^2/4

S = a + ak + ak^2 +,···,+ b.
kS = ak + ak^2 + ak^3 +··· + bk,
kS − S = bk − a
S = (bk − a)/(k-1)

2. 复杂度

loops循环

for (int i = 1; i <= n; i++)  // for (int i = 1; i <= 3*n; i++) // i <= n+5;  i += 2;
{
    // code  一层循环 O(n)
}

for (int i = 1; i <= n; i++) 
{
    for (int j = 1; j <= n; j++) 
    {
        // code 二层循环 O(n^2)
    }
}
// n层循环 O(n^k)====

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
        // code   两层变量不一致  O(n*m)
    }
}

递归 Recursion



3. 排序

4. 数据结构

5. 穷举搜索 Complete search

6. 贪婪算法 Greedy algorithms

7. 动态规划 Dynamic programming

8. 平摊分析 Amortized Analysis

9. 范围查询 Range queries

10. 位运算Bit manipulation

二、图算法 Graph algorithms

1. 图结束 Basics of graphs

2. 图遍历 Graph traversal

3. 最短路 Shortest paths

4. 树算法 Tree algorithms

5. 生成树 Spanning trees

6. 有向图 Directed graphs

7. 强连通 Strong connectivity

8. 树查询 Tree queries

9. 路径 path

10. 流 和 割 Flows and cuts

三、高级话题 Advanced topics

1. 数论 Number theory

2. 组合数学 Combinatorics

3. 矩阵 Matrices

4. 概率 Probability

5. 博弈论 对策论 Game theory

6. 字符串算法 String algorithms

7. 平方根算法 Square root algorithms

8. 分割树 遍历 Segment trees revisited

9. 几何学 Geometry

10. 扫描线算法 Line Sweep Algorithm

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cppcheck-2.11-x64-setup.msi是一种用于C++代码静态分析的软件工具。静态分析是一种分析代码而不需要运行它的方法,它可以帮助开发人员发现潜在的代码问题和错误。cppcheck是一个跨平台的工具,它可以在Windows操作系统上运行。 cppcheck-2.11-x64-setup.msi是适用于64位Windows系统的安装程序。通过运行这个安装程序,您可以将cppcheck安装到您的计算机上,并使用它来分析和检查您的C++代码。 cppcheck可以检查代码中的各种错误,比如空指针解引用、缓冲区溢出、内存泄漏等。它还可以检查未使用的变量和函数、类型不匹配、未初始化的变量、代码风格问题等。 cppcheck-2.11-x64-setup.msi提供了一个用户友好的安装界面,使安装过程简单方便。安装完成后,您可以在命令行界面或集成开发环境中使用cppcheck。打开命令行界面或者IDE,输入cppcheck后跟上您想要分析的代码文件的路径,cppcheck将会对这些代码进行分析,并输出任何检测到的问题和错误。 要使用cppcheck进行代码分析,建议您在编码过程中定期运行cppcheck来检查和修复潜在的问题,以提高代码的质量和可靠性。cppcheck还支持一些附加选项,可以根据您的需求定制分析过程,例如通过设置不同的检查级别、排除指定的代码文件或文件夹等。 总之,cppcheck-2.11-x64-setup.msi是一种方便的工具,可以帮助C++开发人员发现和修复代码中的潜在问题和错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值