编程比赛常用技巧总结

  • 输入输出
    • 加快输入输出
    • 读入一行字符串
    • 常用输出格式控制
  • 比赛常用算法
    • 四舍五入
    • 绝对值
    • 快速幂算法
    • 最短路算法
    • 并查集
    • 二叉树建树
    • 结构体重载小于号
  • 数据结构
    • pair
    • vector
    • set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列
    • deque
    • stack
    • queue

我这里的编程比赛主要指的是算法类的比赛,例如蓝桥杯,天梯赛,CCF之类的比赛。

为了备战天梯赛、蓝桥杯而写的一个总结。

输入输出

加快输入输出

ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);

cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几(但是好像还是scanf、printf比较快)

读入一行字符串

getline(cin,str)

常用输出格式控制

用来控制保留几位小数

setiosflags(ios::fixed) 控制是否是小数
setprecision(2)控制保留几位小数
cout<<setiosflags(ios::fixed)<<setprecision(2)<<e<<"%";

设置宽度 及填充对应字符

setw(5)<<setfill('0')

比赛常用算法

四舍五入

如果忘记了四舍五入的函数的话

int r(double a)
{int b;if(a>0){return (a*2+1)/2;}else{return (a*2-1)/2;}
}

绝对值

fabs()//用于求浮点数绝对值
abs()//用于求整形的绝对值

快速幂算法

 求 m^k mod p,时间复杂度 O(logk)。k相当于转成2进制,根据最后以为判断是否应该乘
int qmi(int m, int k, int p)
{int res = 1 % p, t = m;while (k){if (k&1) res = res * t % p;t = t * t % p;k >>= 1;}return res;
}

最短路算法

int g[N][N];  // 存储每条边
int dist[N];  // 存储1号点到每个点的最短距离
bool st[N];   // 存储每个点的最短路是否已经确定// 求1号点到n号点的最短路,如果不存在则返回-1
int dijkstra()
{memset(dist, 0x3f, sizeof dist);//注意是赋值的为0x3fmemset赋值是按字节赋值dist[1] = 0;for (int i = 0; i < n - 1; i ++ )//第一个点已经找到所以循环n-1{int t = -1;     // 在还未确定最短路的点中,寻找距离最小的点for (int j = 1; j <= n; j ++ )if (!st[j] && (t == -1 || dist[t] > dist[j]))t = j;// 用t更新其他点的距离for (int j = 1; j <= n; j ++ )dist[j] = min(dist[j], dist[t] + g[t][j]);st[t] = true;}if (dist[n] == 0x3f3f3f3f) return -1;return dist[n];
}

并查集

(1)朴素并查集:int p[N]; //存储每个点的祖宗节点// 返回x的祖宗节点int find(int x){if (p[x] != x) p[x] = find(p[x]);return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ) p[i] = i;// 合并a和b所在的两个集合:p[find(a)] = find(b);(2)维护size的并查集:int p[N], size[N];//p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量// 返回x的祖宗节点int find(int x){if (p[x] != x) p[x] = find(p[x]);return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ){p[i] = i;size[i] = 1;}// 合并a和b所在的两个集合:size[find(b)] += size[find(a)];p[find(a)] = find(b);(3)维护到祖宗节点距离的并查集:int p[N], d[N];//p[]存储每个点的祖宗节点, d[x]存储x到p[x]的距离// 返回x的祖宗节点int find(int x){if (p[x] != x){int u = find(p[x]);d[x] += d[p[x]];p[x] = u;}return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ){p[i] = i;d[i] = 0;}// 合并a和b所在的两个集合:p[find(a)] = find(b);d[find(a)] = distance; // 根据具体问题,初始化find(a)的偏移量

二叉树建树

例如:
输入前序遍历、中序遍历
输出层序遍历
一直操作左右两边便好

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<queue>
#define tree node*
using namespace std;
struct node{int d;tree l;tree r;
};
const int N=40;
int z[N],q[N],n;
tree Build(int ql,int qr,int zl,int zr)
{if(ql>qr) return NULL;tree root=new node;root->d=q[ql];int k;for(int i=zl;i<=zr;i++){if(z[i]==q[ql]){k=i;}}int leftnum=k-zl;root->l=Build(ql+1,ql+leftnum,zl,k-1);root->r=Build(ql+leftnum+1,qr,k+1,zr);return root;
}
void cen(tree t)
{int i=0;queue<tree> q;q.push(t);while(!q.empty()){tree f=q.front();i++;if(i==n){cout<<f->d;}else{cout<<f->d<<" ";}q.pop();if(f->r!=NULL){q.push(f->r);}if(f->l!=NULL){q.push(f->l);}}
}
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>z[i];}for(int i=0;i<n;i++){cin>>q[i];}tree t=Build(0,n-1,0,n-1);cen(t);
}

结构体重载小于号

用于设置map<node,int> 类型的数据

bool operator<(const People &t) const{if(time!=t.time) return time<t.time;else return idx<t.idx;}

数据结构

默认是大根堆
想要转成小根堆还有是读入的数转化为负数,输出的时候输出正数就好。

priority_queue, 优先队列,默认是大根堆size()empty()push()  插入一个元素top()  返回堆顶元素pop()  弹出堆顶元素定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void printHeap(vector<int> &v){for(vector<int>::iterator it= v.begin();it!=v.end();++it){cout<< *it <<" ";}cout<<"\n"<<endl;
}int main()
{vector<int> min={10,30,22,6,15,9};//建立小顶堆make_heap(min.begin(), min.end(), greater<int>());printHeap(min);//6 10 9 30 15 22//插入元素min.push_back(20);push_heap(min.begin(),min.end(), greater<int>());//该算法前提:必须在堆的条件下printHeap(min); //6 10 9 30 15 22 20   仍为小顶堆//删除堆顶元素pop_heap(min.begin(),min.end(), greater<int>());printHeap(min);//9 10 20 30 15 22 6  不为小顶堆 这个pop_heap操作后,实际上是把堆顶元素放到了末尾min.pop_back();//这才彻底在底层vector数据容器中删除printHeap(min);//9 10 20 30 15 22  仍为小顶堆//堆排序  保持greater,小顶堆,得到的是降序sort_heap(min.begin(),min.end(), greater<int>());//试了用less,结果杂乱无章printHeap(min);//30 22 20 15 10 9 注意结果是降序的哦!!!其实是调用了很多次pop_heap(...,greater..),每一次都把小顶堆堆顶的元素往末尾放,没放一次end迭代器减1return 0;
}

pair

pair<int, int>first, 第一个元素second, 第二个元素支持比较运算,以first为第一关键字,以second为第二关键字(字典序)

vector

vector, 变长数组,倍增的思想size()  返回元素个数empty()  返回是否为空find(v.begin(), v.end(), a) ,如果能在容器v中不能寻找到a,则返回v.end()clear()  清空front()/back()push_back()/pop_back()begin()/end()[]支持比较运算,按字典序

set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列

size()empty()clear()begin()/end()++, -- 返回前驱和后继,时间复杂度 O(logn)set/multisetinsert()  插入一个数find()  查找一个数set_name.find(element) count()  返回某一个数的个数erase()(1) 输入是一个数x,删除所有x   O(k + logn)(2) 输入一个迭代器,删除这个迭代器lower_bound()/upper_bound()lower_bound(x)  返回大于等于x的最小的数的迭代器upper_bound(x)  返回大于x的最小的数的迭代器map/multimapinsert()  插入的数是一个pairerase()  输入的参数是pair或者迭代器find()[]  注意multimap不支持此操作。 时间复杂度是 O(logn)lower_bound()/upper_bound()

deque

效率低

size()empty()clear()front()/back()push_back()/pop_back()push_front()/pop_front()begin()/end()[]

stack

stack, 栈size()empty()push()  向栈顶插入一个元素top()  返回栈顶元素pop()  弹出栈顶元素

queue

queue, 队列
size()
empty()
push() 向队尾插入一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头元素

编程比赛常用技巧总结相关推荐

  1. CUDA编程之常用技巧与方法

    作者 | kaiyuan  编辑 | 汽车人 原文链接:https://zhuanlan.zhihu.com/p/584501634 点击下方卡片,关注"自动驾驶之心"公众号 AD ...

  2. ACM比赛常用技巧算法

    1.从前到尾!找间隔距离 在程序设计竞赛中,我们会遇到这样一个问题,在一个有序序列中,任取其中的几个点(前提是小于序列的长度),求他们之间的最大间隔距离, 利用下面的代码+二分查找 void solv ...

  3. Android程序设计报告总结,Android编程常用技巧实例总结

    本文实例讲述了Android编程常用技巧.分享给大家供大家参考,具体如下: 1. 登录的时候,如果输入有误,则输入框左右震动,表示输入有误 在res下准备一个anim文件夹,里面包含两个文件,main ...

  4. python 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址_Python编程常用技巧,你知道几个?...

    现在Python是个炙手可热的技能,很多人都想着入手学学Python编程,甚至包括一些知名人士,比如知名地产商潘石屹就开始学Python.关于Python编程的内容在网络上也非常多,本文虫虫给大家总结 ...

  5. Linux Shell常用技巧(目录)

    Linux Shell常用技巧(一) http://liuxuyang.blog.51cto.com/2546552/1289413 一. 特殊文件: /dev/null和/dev/tty 二. 简单 ...

  6. 【shell 大系】Linux Shell常用技巧

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

  7. python创意编程比赛-关于举办2019年青岛市青少年创意编程与智能设计大赛的通知...

    原标题:关于举办2019年青岛市青少年创意编程与智能设计大赛的通知 根据青岛市科协.教育局<关于开展2019年青岛市青少年科学教育系列活动的通知>(青科协字[2019]20号)文件相关要求 ...

  8. 【转】oracle存储过程常用技巧

    原文链接 http://www.cnblogs.com/chinafine/archive/2010/07/12/1776102.html 我们在进行pl/sql编程时打交道最多的就是存储过程了.存储 ...

  9. SemEval-2020自由文本关系抽取冠军方案解读 (附NLP竞赛常用技巧总结)

    本文将回顾平安人寿近期在PaperWeekly × Biendata直播间进行的主题为「SemEval-2020自由文本关系抽取冠军方案解读(附NLP竞赛常用技巧总结)」的技术分享,由平安人寿AI团队 ...

最新文章

  1. [Dynamic Language] Python File Operator
  2. POJ2299 树状数组求逆序对
  3. 前端学习(1162):箭头函数面试题
  4. docker构建oracle集群,docker 构建 oracle数据库 镜像-Go语言中文社区
  5. winpe装双系统linux_使用syslinux在u盘安装pubbylinux和winpe双系统
  6. 关于Cocos2d-x发布游戏的时候遇到的问题和解决
  7. Raid、lvm知识
  8. [转]ASP.NET 页生命周期概述
  9. Python简单实现图书管理系统
  10. 包含农历、节气、节假日的前端日历
  11. 免费搭建个人网站流程!马上拥有自己的网站!
  12. 投票计数python
  13. 用一行`CSS`实现10种布局
  14. 非转基因保护品种覆盖南北 北方旱作国稻种芯-517功能苦瓜稻
  15. excel冻结窗口怎么设置_excel打印区域怎么设置?excel表格打印区域怎么设置?
  16. 如何理解dubbox
  17. 五、Lua 变量的学习
  18. UI 设计中的视觉无障碍设计
  19. 美国哈佛学院计算机硕士,美国计算机硕士申请 专业方向介绍以及院校推荐
  20. 【转】一个拿到人人网和淘宝网offer的大四学生的Android学习经历

热门文章

  1. 计算机毕业设计之java+springboot基于vue的校园志愿者管理系统
  2. 实用流量数据分析指南
  3. 学习技术领导力(一)
  4. 正规式和有限自动机二(NFA转DFA)
  5. C++的 fmod 函数
  6. ubuntu输入法启动命令
  7. 3.1 多维随机变量及其联合分布
  8. 房总鼎立分享收入多少合适理财?低收入家庭理财办法有什么?
  9. 刚获得物理诺奖的数学家:现实是对完美数学真理的扭曲反应,人脑是最终量子计算机!...
  10. 手机更换电池-小米8se操作步骤