
程序设计(算法向)
刷题心得
Zih_An
坐科
展开
-
非递归实现的二叉树前、中、后、层序遍历
今日刷题时遇到的问题,顺便记一下模板LeetCode 144.二叉树前序LeetCode 145.二叉树后序第一套模板(个人倾向)// 前序vector<int> preorderTraversal(TreeNode* root) { if(!root) return {}; vector<int> result; stack<TreeNode*> stk; stk.push(root);原创 2020-11-17 03:21:26 · 150 阅读 · 0 评论 -
关于动态规划的新理解
今日在LeetCode 53. 最大子序和上看到的一个题解,很好的诠释了动态规划的内涵关于遍历:i位置是子序列的头。这是暴力法。以子序列长度为单位遍历。见LeetCode 5.最长回文子串i位置是子序列的尾。这是最常见的动态规划。今日实战的动态规划53. 最大子序和70. 爬楼梯...原创 2020-11-08 01:08:38 · 91 阅读 · 0 评论 -
csp模拟4
A#include<cstdio>#include<set>using namespace std;int main(void){ int n,k; scanf("%d%d",&n,&k); int res=0; for(int i=0;i<n;i++){ long long a; scanf("%lld",&a); if(k>10) continue; else{ set<int> s;原创 2020-06-05 12:16:02 · 339 阅读 · 0 评论 -
week12作业
A题意给出n个数,找出出现至少(n+1)/2次的数输入51 3 2 3 3111 1 1 1 1 5 5 5 5 5 571 1 1 1 1 1 1输出351思路输入的同时,用map统计各个数出现的次数,若大于等于(n+1)/2,记录当前索引,输入完毕后输出该值。代码#include<cstdio>#include<map>using namespace std;const int MAXN=1e6;int N,num[MAXN原创 2020-06-05 12:15:35 · 160 阅读 · 0 评论 -
kmp
注释部分为自己写的kmp,TLE了,没有优化#include<cstdio>#include<string.h>using namespace std;char P[10010],S[1000010];int tms[10010];int pLen,sLen;int kmp(){ /* int tot=0,j=0; for(int i=0;i<sLen;){ if(j==pLen-1 && S[i]==P[j]){ tot++;原创 2020-06-05 12:15:20 · 171 阅读 · 0 评论 -
week15作业:kbdr hash、字典树
A总结bkdr hashseed=7,17,131…mod=1e9+7unsigned int bkdrHash(string s){ unsigned int hash=0,seed=131,mod=1e9+7,tmp=seed; int n=s.size(); for(int i=0;i<n;i++){ unsigned int as=s[i]; hash+=as*tmp%mod; tmp*=seed; } return hash;}注意输入必须用get原创 2020-06-05 12:15:08 · 322 阅读 · 0 评论 -
week14作业
A代码#include<cstdio>#include<cmath>using namespace std;int n,a,b,c; //a:R b:P c:Schar s[105];char ans[105];int vis[105],cnt=0;void init(int n){ cnt=0; for(int i=0;i<n;i++){ ans[i]=' '; vis[i]=0; }}int main(void){ int t;原创 2020-06-05 12:14:45 · 157 阅读 · 0 评论 -
week13作业
A题意k个奇偶性相同的数,和为n。求这k个数,若不存在输出NO。样例Input810 3100 48 797 28 83 105 31000000000 9OutputYES4 2 4YES55 5 5 35NONOYES1 1 1 1 1 1 1 1NOYES3 1 1YES111111110 111111110 111111110 111111110 111111110 111111110 111111110 111111110 11111112原创 2020-06-05 12:14:31 · 148 阅读 · 0 评论 -
csp 201809-3 元素选择器
题意测试结果思路对于初始化的所有输入,用结构体表示每一行输入的信息,成员包含:没有'.'和' '的字符串向量处理'.'后的所处级号level该层的父亲行号parentgetline初始化的输入后,需要预处理:使用istringstream流,用空格分隔各字符串对于存在'.'的字符串,删除所有'.',并通过其数量记录级号level对于第一个字符串,即标签,需改为小写从后往前遍历输入的所有行元素,当该行的level-1等于第一个遍历行的’level’时,记录该遍历行号为原创 2020-06-05 11:25:51 · 318 阅读 · 1 评论 -
csp 201609-3 炉石传说
题意测试结果思路英雄和随从用People表示,有生命值和攻击力棋盘board用2*8的People指针数组构成,初始化时board[0][0]和board[1][0]为英雄的属性按输入构成主程序框架,用plr表示当前玩家“summon”操作时,先向后移动随从位置,再插入“attack”操作时,更新生命值,分别判断。若随从生命值<=0,随从向前移;若被攻方英雄生命值<=0,且当前比赛没有结果,则记录plr"end"操作时,plr=1-plr更新当前玩家最后按输出格式输原创 2020-06-04 21:09:59 · 230 阅读 · 0 评论 -
t1/t2训练
A#include<iostream>#include<string>using namespace std;int main(void){ int n; cin>>n; string s; cin>>s; for(int i=0;i<s.size();i++) s.erase(i,i); cout<<s<<endl; return 0;}B原创 2020-05-15 09:27:57 · 354 阅读 · 0 评论 -
csp模拟3
T1100分#include<cstdio>using namespace std;int n,num[1005];int main(void){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&num[i]); int numPre=num[0],ans=0; for(int i=1...原创 2020-05-06 16:37:35 · 287 阅读 · 0 评论 -
week11作业
A题意一套房,房价最初200w,每年以K%增长;一个人,年薪Nw。若能在20年内买上房,输出年数;若不能,则输出Impossible。输入50 10输出8思路循环,更新房价、存款,若存款>=房价,则跳出循环输出年,否则输出Impossible总结第一遍wa用了int,后ac改为double注意数据类型(运算中、输入、输出),此处在运算中出现了浮点数代码...原创 2020-05-05 02:40:44 · 177 阅读 · 0 评论 -
csp 201604-3 路径解析
题意评测结果思路看到用字符/连接起来需要处理的字符串,若是用python第一反应用.split('/')拆分成一个list再处理因此在c++中,要先实现一个split操作,结果存在vector中,再进行join连接实现split操作,分割当前目录和每次需要解析的路径,存至不同的vector中若需要解析的路径为空,输出当前路径若需要解析的路径开头不是'/'(即相对路径),...原创 2020-04-28 22:30:03 · 225 阅读 · 0 评论 -
week10作业:动归LIS/LCS
A题意两个数n和m,对n可进行乘以2或3的操作,使其经过 i 次操作后n与m相等。若能转换则输出i,若不能则输出-1。(1<=n<=m<=5*10^8)输入与输出Simple Input 1120 51840Simple Output 17Simple Input 242 42Simple Output 20Simple Input 34...原创 2020-04-27 23:38:34 · 214 阅读 · 0 评论 -
week10模拟
A题意某个包含偶数个字符的字符串X,一半是 S 字符,一半是 T 字符。如果存在 ST 是该串的子串,则删除掉最左边的 ST。即 TSTTSS⇒TTSS、SSSTTT⇒SSTT⇒ST⇒空。输入TSTTSS输出4思路利用<string>类型操作erase同时对当前位置的字母和紧挨着的下一个字母判断,若为ST,则删除。删除后,若当前位置下标为0,则不变;否...原创 2020-04-22 16:06:25 · 196 阅读 · 0 评论 -
week9作业
ABC题意x张椅子,各自有ai个人,现在又过来y个人。记k=所有椅子上人数的最大值,求k的最大值mx和最小值mn。输入37161输出6 13思路mx:mx即为ai最大值加上ymn:mn的最小值为ai的最大值。在ai最大值的基础上,先将ai其它的值用y尽量填充到ai最大值。若剩余的值为0,则mn为ai最大值;若剩余值不为0,则将其平均分配至ai,取a...原创 2020-04-21 13:23:37 · 297 阅读 · 0 评论 -
week8作业:差分约束、kahn拓扑排序、kosaraju强联通分量问题
A/D不是很明白为什么把处理环的部分删了,D就能过…也许判断写错了??? 然而A能过…略魔幻…#include<cstdio>#include<queue>#include<algorithm>using namespace std;const int MAXN=50005;const int INF=50005;struct Edge{...原创 2020-04-17 01:10:10 · 284 阅读 · 0 评论 -
csp模拟2
T1#include<cstdio>#include<algorithm>using namespace std;const int MAXN=1e4+5;long long a[MAXN];int n;int main(void){ int t; scanf("%d",&t); while(t--){ s...原创 2020-04-15 13:14:55 · 189 阅读 · 0 评论 -
csp 201512-3 画图
题意图初始化为 ‘.’ 。2种画图方法:画线或填充。画线:保证画水平或垂直填充:以上下左右填充,知道遇到线或者图的边界坐标以左下角为原点 (0, 0)样例输入:16 13 90 3 1 12 10 12 1 12 30 12 3 6 30 6 3 6 90 6 9 12 90 12 9 12 110 12 11 3 110 3 11 3 11 4 2 C样例...原创 2020-04-05 00:32:25 · 430 阅读 · 0 评论 -
week7作业:Floyd算法、dijkstra、SPFA
A#include<cstdio>#include<algorithm>using namespace std;const int MAXN=505;int dis[MAXN][MAXN];int N,M;int main(void){ int group; scanf("%d",&group); while(group--...原创 2020-04-02 16:29:26 · 219 阅读 · 0 评论 -
week6作业:dfs求树的直径、并查集、kruskal求最小生成树
A#include<cstdio>#include<vector>#include<algorithm>using namespace std;const int MAXN=1e4+5;struct Edge{ int u,v,w; Edge(){} Edge(int x,int y,int z):u(x),v(y),w(z...原创 2020-04-01 09:25:05 · 242 阅读 · 0 评论 -
week6模拟
#include<cstdio>#include<set>#include<map>using namespace std;int A,B,a1,b1,a2,b2;int method[10];pair<int,int> cards[105];set<pair<int,int> > handcard;int...原创 2020-03-27 13:43:36 · 338 阅读 · 0 评论 -
week5作业:单调栈、差分与前缀和、尺取法
A#include<cstdio>#include<stack>using namespace std;const int MAXN=1e6;long long n,h[MAXN];int main(void){ while(1){ scanf("%lld",&n); if(n==0) ...原创 2020-03-24 10:31:50 · 244 阅读 · 0 评论 -
week4作业
T1#include<cstdio>#include<algorithm>using namespace std;const int MAXN=1005;struct Task{ int DDL; int points;}tasks[MAXN];int N,T;bool cmp(const Task x,const Task y){ ...原创 2020-03-20 00:42:32 · 133 阅读 · 0 评论 -
csp模拟
T1#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=10005;char str[MAXN];int main(void){ scanf("%s",str); int str_len=strlen(str); in...原创 2020-03-20 00:04:08 · 425 阅读 · 0 评论 -
week3作业:DFS+贪心算法
A#include<cstdio>using namespace std;const int MAXN=100;int n,K,S;int numbers[MAXN];int visit[MAXN];int method;void dfs(int num,int kLeft,int sLeft){ if(kLeft==0&&sLeft==0){ ...原创 2020-03-06 16:12:58 · 253 阅读 · 0 评论 -
化学-烷烃基
题意有5种烷烃基,6个原子,5个化学键,用编号对表示化学键的位置(原子未预先编号),根据所给的化学键编号,输出烷烃基类型。思路观察烷烃基,按照各个原子连接的化学键数目区别,特征如下:n-hexane:有2个点度为1,其余点均为42,3-dimethylbutane:有4个点度为1,其余点均为32,2-dimethylbutane:有4个点度为1,1个点度为4,1个点度为22-met...原创 2020-03-06 00:00:50 · 942 阅读 · 0 评论 -
DP问题:以最长公共子序列为例的理解
一、题意字符串s和t,长度分别为n和m,寻找一个最长的公共子序列si,si+1,…,si+n,要求每个字符都存在于s与t,且下标大小均为由小到大。二、思路问题定位DP问题(dynamic programming)DP问题1. 问题识别:DP问题通常以寻找最优解(minimize or maximize)为目的。2. 普通的暴力方案(brute force):列举所有的可能,但...原创 2020-03-04 22:59:12 · 360 阅读 · 0 评论 -
POJ 3253
代码#include<cstdio>#include<queue>#include<functional>using namespace std;int main(void){ priority_queue<int,deque<int>,greater<int> >pq; int N,temp; scanf...原创 2020-03-02 21:01:55 · 123 阅读 · 0 评论 -
POJ 1786
代码#include<iostream>#include<cstdio>#include<vector>#include<map>#include<algorithm>using namespace std;map<char,int> dealPlayers;map<char,int> colo...原创 2020-02-28 17:37:35 · 230 阅读 · 0 评论 -
HDU 2093
代码#include<iostream>#include<cstdio>#include<sstream>#include<vector>#include<string>#include<algorithm>using namespace std;struct info{ string name; int...原创 2020-02-28 13:46:36 · 291 阅读 · 0 评论 -
倒水问题
#include<cstdio>#include<iostream>#include<queue>#include<string>using namespace std;const int MAXN=105;int A,B,C;struct pos{ int preA; int preB; string methodAB; ...原创 2020-02-26 23:07:43 · 1447 阅读 · 0 评论 -
POJ 3069
#include<iostream>#include<algorithm>using namespace std;const int MAXN=1005;int R, n, X[MAXN];int main(void){ while(1){ cin>>R>>n; if(R==n&&R==-1) break...原创 2020-02-26 18:22:27 · 195 阅读 · 0 评论 -
POJ 3617
取最多次的工作思想:每次在可选的工作中(还未开始的工作)取结束时间最早的工作作为#include<cstdio>#include<algorithm>using namespace std;int main(void){ int n=5; int s[]={1,2,4,6,8}; int t[]={3,5,7,9,10}; //方法一:插入排序,由...原创 2020-02-26 16:33:57 · 216 阅读 · 0 评论 -
求解排列组合:递归与next_permutation
递归实现排列、组合#include<cstdio>#include<algorithm>using namespace std;const int MAXN=100;int arr[MAXN],n; //排列void pailie(int i) { if(i==3) { for(int x=0; x<n; ++x) printf("%d ...原创 2020-02-24 15:48:41 · 157 阅读 · 0 评论 -
POJ 1852
#include<cstdio>#include<algorithm>using namespace std;int main(void) { int r; scanf("%d",&r); while(r--) { int L, n; scanf("%d%d", &L, &n); int *x = new int[n]...原创 2020-02-19 17:34:35 · 131 阅读 · 0 评论 -
抽签
#include<cstdio>#include<vector>#include<algorithm>using namespace std;int main(void){ int n,m; scanf("%d%d",&n,&m); int *k = new int[n]; for(int i=0;i<n;++i) ...原创 2020-02-19 21:58:39 · 382 阅读 · 0 评论 -
能组成三角形的最大周长
题意给n个数,取3个组成三角形,且要求三角形的周长是最大的。思路组成三角形的条件若a为最大值,则a<b+c;即,若a>=b>=c,则a<b+c周长最大即,max(a+b+c)所有数由大到小排序,第一组后2个数的值之和大于第1个数的,则为能组成三角形的最大周长的组合。理由1.由于已从大到小排序,若后2个数之和小于或等于第1个数,显然后续的数也不可能大于第...原创 2020-02-19 23:00:31 · 964 阅读 · 0 评论 -
迷宫问题:BFS求解最短路径
迷宫BFS#include<cstdio>#include<queue>#include<stack>using namespace std;const int MAXN=100;char maze[MAXN][MAXN];bool reach[MAXN][MAXN]= {false};int N,M;pair<int,int> ...原创 2020-02-24 15:39:53 · 633 阅读 · 0 评论