a1003
a1003题目大意根据距离人数构成最短路径,如果距离相等,选择人数多的,最后输出有几条最短路径和最多几个人
解决方法最短路径的代码正常写法
0.首先初始化G的所有值设置为maxn,距离d也设置maxn,visited设置false
1.首先是选出距离的点123456789int less=-1; int min=maxn;// 首先找到最小编 for (int i = 0; i < n; ++i) { if (d[i]<min&&!visited[i]){ less=i; min=d[i]; } }
2.异常检查就是如果没找到最短的边那就结束
123if (less==-1){ return 0; }
3.设置为访问过,并且通过这个点的周围所有点更新d12345678910111213141516171 ...
a1002
a1002题目大意。两个多项式相加。
解决方法。构建一个双精度的数组。同时在构建一个索引表。这个索引表来看一共有哪几个是要加入的指数,如果系数为零,那么就把它给加入到索引表里面。然后进行加法运算,如果最后的系数还是为零,那么就减少一个要输出的数值。最后再使用short来进行排序,按倒叙的方法来输入所有的值。
代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <map>#include <cmath>#include <set>#include <stack>#include <queue>//cin用多了超市u ...
a1001
a1001题目大意计算结果并且用英式符号来表达。 就是每三位用一个逗号来表达。
解决方法。通过把他们的和变成字符串。然后从后往前便利了每三位取模等于零,那就是要添加逗号的地方。但是了最后一个和第一个不能要呀逗号。同时还要考虑到这个字符串的正负性。
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <map>#include <cmath>#include <set>#include <stack>#include <queue>//cin用多了超市using namespace std;const int maxn=10010;int main() ...
pat输入
输入方法1.eof123while(scanf("%d",&n)!=EOF){ }
2.条件读入12while(scanf("%d",&n)!=-1){}
3.for
单纯形方法
单纯形方法使用1.第一步:化标准形
标准型的规定1.目标函数要求max2.约束条件均为等式3.决策变量为非负约束最终结果
2.第二步:构建单纯形表1.找出基向量,就是他们系数组成的矩阵是单位向量2.把z函数的系数也加入这个矩阵,除了自己的系数是1,其余都为0,用行变换变成只有1个1,其余列上都为0
3.第三步:求解1.找出θi里最大的所对应那一列 如图,应该是3最大,对应的就是x2那一列,x2就是换入变量,再求b/aij,就是b那一列除x2对应的那一列,那个最小就是,那个元素的行向量对应的向量换出变量(b>0才可以除,若都小于等于0,则无解)12/3=4,9/1=9,4小,x3就是换出变量
2.把x2那一列化成010,保证只有x2与x3相交的为1,其他的都为0,在x2列
3.重复1,2两步,直到z的系数都小于等于0此时x1是换入,x4是换出,变成001
4.结束当θi都小于等于0是结束,x*=(3,3,0,0)T,z=15
5.总结解的分类1.唯一最优解当所有非基变量的检验数都小于零,则原问题有唯一最优解 ...
动态规划
动态规划1.定义
动态规划算法介绍
1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
●
2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
●
3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的****。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )
●
4)动态规划可以通过填****表的方式来逐步推进,得到最优解.
2.背包问题
3.解决思路
4.个人理解构建数组,行是在前一行新加的物品,猎是增加的重量,最大不过背包能加的重量。当新加一个物品时看这个是否超重,如果超重,那就把上一行的价值赋值到下面来;如果没有超重,那就选取最大值(在上一行的这个,和这个物品的价值+v【i-1】【j-w【i】】)来选取最大值,直到填完所有表,最后一个就是最好的。
5.代码讲解注意一个坑,物品的下标是从0开始的,但是在表里是第一行开始的,所以在找重量是需要i-1
如果需要记录 ...
汉诺塔
汉诺塔1.分治定义分治法在每一层递归上都有三个步骤:
1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
3)合并:将各个子问题的解合并为原问题的解。
if |P|≤n0
then return(ADHOC(P))
//将P分解为较小的子问题 P1 ,P2 ,…,Pk
for i←1 to k
do yi ← Divide-and-Conquer(Pi) 递归解决Pi
T ← MERGE(y1,y2,…,yk) 合并子问题
return(T)
其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,…,yk)是该分治法中的合并子算法,用于将P的子问题P1,P2 ,…,Pk的相应的解y1,y2,…,yk合并为P的解。
2.汉诺塔定义
Ø汉诺塔的传 ...
广度优先
广度优先1.定义1)访问初始结点v并标记结点v为已访问。
2)结点v入队列
3)当队列非空时,继续执行,否则算法结束。
4)出队列,取得队头结点u。
5)查找结点u的第一个邻接结点w。
6)若结点u的邻接结点w不存在,则转到步骤3;否则循环执行以下三个步骤:
6.1 若结点w尚未被访问,则访问结点w并标记为已访问。
6.2 结点w入队列
6.3 查找结点u的继w邻接结点后的下一个邻接结点w,转到步骤6。
2.个人理解广度优先就是遍历他的所有的子节点再遍历他的子节点的子节点,直到为空才停止(遍历市也是要威访问过的),同样万一有断点,所以需要for循环一遍
3.代码讲解需要一个队列来进行排序,先压入所有节点标为已经访问过的,再排出一个节点,并把这个节点的子节点全部压入标记已经访问,当队列为空才停止
1234567891011121314151617public static void bfs(int i,int[][] arr,boolean[] visited){ Queue<Integer> queue=new LinkedList<> ...