- 博客(57)
- 收藏
- 关注
原创 合并果子(小根堆)
void put(int x){//放入元素 int pre,post;//前驱和后继 heap[size++]=x;//申请一块区域存储x pre=size;//前区为x的编号 while(pre>1){//从编号向1搜索 post=pre/2;//找父节点 if(heap[post]<=heap[pre])//如果父节点
2017-10-05 09:56:56 670
原创 潜伏者(关于map的用法)
【题目描述】 https://www.luogu.org/problem/show?pid=1071 【思路】 用map模拟加判断即可。【代码】#include<map>#include<cstdio>using namespace std;char s1[100],s2[100];map<char,char> mp;//定义map映射容器 int main(){ scanf
2017-10-05 08:35:25 395
转载 P1017 进制转换
【题目描述】 进制转换 【题目分析】 此题就是一道很裸的数学题,只是对于取余小于零的情况多加注意即可 【代码】#include<bits/stdc++.h>using namespace std;int m,numten,n;void change(int a){ int k; k=a%m; a=a/m; if(k<0){ k-=m;
2017-10-04 15:43:20 322
原创 猫和老鼠
【题目描述】 猫和老鼠在10*10的方格中运动,例如: …….. ……*… …….. ………. …*.C…. …..… …*…… ..M……* ….…. ..……C=猫(CAT) M=老鼠(MOUSE) *=障碍物 .=空地猫和老鼠每秒中走一格,如果在某一秒末他们在同一格中,我们称他们“相遇”。 注意,“对穿”是不算相遇的。猫和老鼠的移动方式相同:平时沿直线走,下一步如
2017-10-03 11:47:19 1260
原创 分治算法之排序和逆序对
今天重新学习了一下分治算法,又温习了一下快速排序和归并排序的思路。归并排序【思路】①递归到只剩一个元素 ②将序列分成长度相等或接近的两部分。 ③递归——对划分后的两部分序列分别进行归并排序。 ④合并——递归地排序之后,两边的序列都已经有序,接下来需要将这两个有序序列合并。 如何合并呢:我们
2017-09-17 10:55:27 2088
原创 马的哈密尔顿链
【问题描述】在一个 8×8 的国际象棋棋盘上,马(“马走日”) 的初始位置(x, y)。 怎么走可以不重复地走过每一个格子? 这样输出结果:如果马在第 i 步落在了格子(s, t)上,则在对应位置输出 i。 【贪心策略】 每次往出度最小的点上跳。 【代码】#include<iostream>#include<iomanip>#include<cstring>using namespace
2017-09-16 21:12:55 541
转载 传纸条
题目描述 传纸条 【分析】 设f[i][j][k][l]为从小渊传到小轩的纸条到达(i,j),从小轩传给小渊的纸条到达(k,l)的路径上取得的最大的好心程度和。完全可以换一个思路想,即求从给定的起点出发走到指定位置的两条最短严格不相交路线。那么特别显然,转移方程是 f[i][j][k][l]=max( f[i][j-1][k-1][l] , f[i-1][j][k][l-1] , f[i][j
2017-09-10 11:43:03 256
原创 P1514 引水入城
【题目描述】 见链接P1514 引水入城 【分析】 bfs填色问题变式,如果从第一行能流到最后一行就保留,统计一下最后覆盖的区间是否覆盖满最后一行;然后运用贪心,选择连续的且覆盖最多的蓄水站即可,如果不满足,输出缺少的即可。 样例: 【参考代码】#include<iostream>#include<cstdio>#include<algorithm>#include<cstr
2017-09-03 15:44:49 240
转载 洛谷P1312 Mayan游戏
【题目描述】见链接 https://www.luogu.org/problem/show?pid=1312 【解析】 直接模拟和搜索即可,注意保存好数据,防止回溯时丢失。 【代码】// Mayan游戏//一个模拟程度大于搜索的搜索题……//大体模拟过程:移动--下降--消除--repeat--到达规定步数判断是否消除完 //具体剪枝方案luogu上的其他题
2017-09-03 15:17:53 319
原创 P1092 虫食算
【题目描述】 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: http://paste.ubuntu.com/25448822/ 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中
2017-09-03 11:22:57 339
转载 dijkstra算法入门
【题目描述】无向连通图 G 有 n 个结点,依次编号为 0,1,2,…,(n-1)。用邻接矩阵的 形式给出每条边的边长,要求输出以结点 0 为起点出发,到各结点的最短路径长度。 使用 Dijkstra 算法解决该问题:利用 dist 数组记录当前各结点与起点的已找到的最 短路径长度;每次从未扩展的结点中选取 dist 值最小的结点 v 进行扩展,更新与 v 相邻的结点的 dist 值;不断进行
2017-09-02 20:21:37 256
转载 kruskal算法入门
【简介】克鲁斯卡尔算法是一种用来寻找最小生成树的算法。在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。即给定一些线段的x,y和权值,当x,y不在一个集合的时候,选取权值最小的一个边,然后把x,y合并到一个集合中(并查集维护)我们用现在来模拟一下Kruskal算法,下面给出一个无向图B,我们使用Kruskal来找无向图B的最小生成树。 首先,我们将所有的边都
2017-08-31 15:32:54 707
转载 并查集入门
【简介】 并查集(Union Find)是一种用于管理分组的数据结构。它具备两个操作:(1)查询元素a和元素b是否为同一组 (2) 将元素a和b合并为同一组。 核心代码: 1.查询代码int find(int k){//寻找根节点 if(node[k].father==k) return k; else{ node[k].father=find(no
2017-08-31 15:16:47 217
转载 归并排序
一.简介 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r
2017-08-31 11:24:44 132
原创 广度优先搜索总结
模板代码:int di[4][2]={0,1,1,0,0,-1,-1,0};//方向定义队列进队while(队列不为空){ 取头元素; 搜索; 判重,判越界; 更新; 进队 ; 老元素出队; }
2017-08-31 11:21:16 299
原创 深度优先搜索总结
DFS 【描述】深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。void dfs(一个或多个状态){ //1.一个或多个判断,return if(){ } if(){
2017-08-31 11:16:39 217
原创 简单数论总结
一.最长子序列问题,见http://blog.csdn.net/qq_37416823/article/details/77718585二·放苹果问题 【问题描述】将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 【分析】根据排列组合公式得,将整数n分成
2017-08-31 11:02:36 192
原创 最长子序列问题
引子:洛谷p1020,导弹拦截 【问题描述】某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于50000的正整数),(1)计算这套系
2017-08-30 16:39:47 343
原创 背包问题总结
一.01背包问题 【问题描述】有n件物品和一个容量为C的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大。 (1) 二维数组表示 1. 定义状态:f[i][c]表示前i件物品恰放入一个容量为c的背包可以获得的最大价值。 2. 状态转移方程:f[i][c]=maxf[i-1][c]f[i-1][c-w[i]]+v[i] (不选这件物品)(选择这件
2017-08-30 16:07:41 293
原创 高精度乘法
#include<bits/stdc++.h>using namespace std;const int MAXN=5000;int A[MAXN],B[MAXN],ans[MAXN],lena,lenb,lenans;void read(int *A,int &len){ string cur; cin>>cur; len=cur.length(); for
2017-08-30 11:45:33 293
转载 P1020 导弹拦截
题干大意:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度
2017-08-30 09:22:09 335
原创 P1616 疯狂的采药,完全背包问题
/*题型:完全背包注意:j与0,1背包反过来即可 */#includeusing namespace std;struct yao{ int value;int heavy;}a[1000001]; int f[1000001];int main(){ int t,n; cin>>t>>n; for(int i=1;i<=n;i++) cin>>a[i].heavy>
2017-08-29 16:56:56 273
转载 P1060 开心的金明
/*题型:0,1背包注意:动态转移方程的写法for(int i=1;i<=n;i++) for(int j=high;j>=a[i].price;j--) f[j]=max(f[j],f[j-a[i].price]+a[i].value) */ #include //万能头文件using namespace std;//std工具箱struct shopping {/
2017-08-29 16:39:34 179
转载 P1182 数列分段Section II
/*80分做法 题型:二分注意:范围为l<=r,左右区间注意。 */ #include //万能头文件using namespace std;int n, m, x, f[100001], p, l, r, mid, sum, ans;//f数组前缀和,sum为分割数列的段数,ans为最终答案int main(){ scanf ( "%d %d", &n, &m );
2017-08-29 15:38:50 406
转载 P1025 数的划分
/*题型:递归,排列组合定义:把一个数N分解为K份,他的方案数把N-i(1<=i<=M/K)分成k-1份的方案数(之和)相等注意:g要定义在函数开头,边界条件注意 */ #includeusing namespace std;int dfs(int sum,int step,int now){ int g=0; if(step==1) return g=1;//边界
2017-08-29 15:26:59 257
转载 P1739 表达式括号匹配
/*题型:栈的模拟 注意:另外定义一个flag,若此时栈以空则不符合题意 */ #include#include#include//库函数 using namespace std;char a;bool flag;int main(){ stack sum; while(1) { cin>>a; if(a=='@'
2017-08-29 15:22:52 326
原创 P1115 最大子段和
/*题型:子段和,滚动数组注意:别忘了%2 如果(sum<0) sum=0;*/ #include#include#include#includeusing namespace std;int sum,a[2],n;int main(){ scanf("%d",&n); scanf("%d",&a[1]); sum=a[1]; for(in
2017-08-29 15:20:51 171
转载 P1996 约瑟夫问题
/***************************************************** 题型:链表注意: t=n,赋初值 s=t; t=p[t]; //s记录数到第几人,t表示数到下一个 p[s]=p[t]; 别忘了删除队列 *******************************************************/
2017-08-29 15:18:46 307
转载 P1433 吃奶酪
/*题型:dfs注意:预处理,回溯 */ #include#include#includeusing namespace std;int n;double dis[16][16],ans=1000000000.0,now,x[16],y[16];//两点距离(预处理),答案,现在的距离,每个点的坐标bool vis[16];//奶酪是否被吃void dfs(int pos,
2017-08-27 20:46:06 237
转载 P1434 滑雪
/*题型:记忆化动归注意哪里return,返回的是一个i,j的dp的值 */ #include#includeusing namespace std;const int maxn=102;int n,m;int map[maxn][maxn];int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向数组int ans=0;int f[ma
2017-08-27 20:36:02 230
转载 P1583 魔法照片
/*题型:排序注意,结构体别搞混了,按照题目意思模拟即可;注意cmp的写法 */ #include#include#include#includeusing namespace std;struct stu{ int W;//权值 int D;//类别 int B;//编号}a[20005];bool cmp(stu a,stu b){
2017-08-27 20:23:08 698
转载 P1908 逆序对
/*题型:树状数组注意:背诵格式,当前树状数组的数目 */#include#includeusing namespace std;int n,a[50001],p[50001],tree[100001],ans;//这里是树状数组模板部分,务必背诵 inline void add(int i,int x){//树状数组添加数 while(i<=n){ t
2017-08-27 20:18:39 257
转载 P1147 连续自然数和
/*题型:数段的连加连减问题注意 起点要小于M/2; */ #includeusing namespace std;int M;int main(){ scanf("%d",&M); for(int a=1;a<=M/2;a++){//因为a如果过了M/2那么再加的话就超过了M int sum=a; for(int x=1;a+x<=
2017-08-27 20:14:09 275
转载 P1017 进制转换
/*题型:进制问题注意:常量数组保存对应基数,数学知识的运用 */#include using namespace std;int main(){ //freopen("input.txt","r",stdin); char js[]="0123456789ABCDEFGHIJ";//常量数组保存对应基数,常量大法吼啊 int n,r; scanf(
2017-08-27 20:10:02 205
转载 P1071 潜伏者
#include #include #include using namespace std;//首先要很清楚一个事情,要读好题//每一个原文字母都与一个密文字母严格对应//也就是说,一个原文字母A假设他对应了密文字母B,那么就不会再有原文字母去对应密文字母B,原文字母A也不可能再去对应除了B的密文字母//所以使用两个表来表示互相对应的关系,检查对应的时候,从密文检查原文对应,从原文
2017-08-27 20:05:24 265
转载 高精度减法
#includeusing namespace std;const int maxn=10005;int a[maxn],b[maxn],c[maxn],ans[maxn];int lena,lenb,lenans;void read(int *a,int &len){ string s; cin>>s; len=s.length(); for(int i=0;i<len;i++
2017-08-27 15:38:40 192
转载 高精度加法
#include#include#includeusing namespace std;const int MAXN=10005;int A[MAXN],B[MAXN],C[MAXN],ANS[MAXN],Len_A,Len_B,Len_ANS;void Read(int *A,int &Len){ string cur; cin>>cur; Len=cur.length();
2017-08-27 15:27:06 167
原创 最大公约数和最小公倍数问题
//最小公倍数=两整数的乘积÷最大公约数#includeusing namespace std;int ans=0;int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b);}int main(){ int x1,y1; cin>>x1>>y1; for(int i=2;i<=1100;
2017-08-27 14:57:07 169
转载 P1010 幂次方
#include#includeusing namespace std;void cg(int n){ if(n==0){//前面五种特判 return ; } if(n==1){ cout<<"2(0)";return ; } if(n==2){ cout<<2;return ; } i
2017-08-26 20:20:08 175
转载 快速幂
#include#include#includeusing namespace std;long long b,p,k,ans;long long qpow(long long n,long long x,long long mod){ if(x==0) return 1;//递归出口:0次方为1 long long res=qpow(n*n%mod,x/2,mod);
2017-08-26 20:18:40 127
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人