算法笔记
文章平均质量分 60
LALAAYANG
这个作者很懒,什么都没留下…
展开
-
lc 04 | 二维数组中查找某元素
lc 04 | 二维数组中查找某元素题目描述解题思路题目描述解题思路(1)我自己的思路是:首先确定 target 可能存在的第一行 i对第 i 行的元素进行二分,若存在,则返回true;若不存在,则继续对第 i 行最后锁定的元素所在列,继续向下遍历,若存在则返回true,否则对于第一个大于target的值,则在该行向左移动,寻找该值是否存在,若存在返回true,不存在返回false过程中要注意的问题有:数组是否为空class Solution {public: boo原创 2021-01-31 21:30:51 · 294 阅读 · 0 评论 -
lc 两数之和 | map & auto
两数之和题目描述解决方法暴力hash需注意问题题目描述解决方法暴力暴力思路简单,但复杂度高:时间复杂度:O(N2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。空间复杂度:O(1)/** * Note: The returned array must be malloced, assume caller calls free(). */int* twoSum(int* nums, int numsSize, int target, int* return原创 2021-01-23 12:09:48 · 298 阅读 · 0 评论 -
CSP 20180302 | 碰撞的小球
CSP 20180302 | 碰撞的小球题目描述解题思路代码题目描述解题思路不要被题目所吓到。只需要考虑每个时刻所有可能转换方向的状态并将其罗列出即可。而这也正是计算机解题相对于人工分析的优点所在。代码//#include<bits/stdc++.h>#include<cstdio>int x[1500];int dir[1500] ;//1为向右,-1为向左 int main(){ for (int i = 0;i < 1500;i++) dir原创 2020-12-10 19:58:50 · 69 阅读 · 0 评论 -
[ ATTENTION ] | c++数组初始化
一个错误的写法:int dir[1500] = { 1 };本意是想将数组dir中的1500个元素全部赋值为1,但实际上当赋值的元素小于元素个数时,剩余位置会被默认元素替代:因此应当使用for循环对其进行赋值:for (int i = 0;i < 1500;i++) dir[i] = 1;...原创 2020-12-10 19:55:33 · 80 阅读 · 0 评论 -
CSP 20180301
CSP 20180301题目代码题目代码#include<bits/stdc++.h>int a[50],add[50]={0};int main(){ int a1; int i=0; int score=0,tag=0; scanf("%d",&a1); while(a1!=0) { a[i]=a1; if(a[i]==1) { add[i]=1; score+=add[i]; } if(a[i]==2) { i原创 2020-12-10 10:09:41 · 182 阅读 · 0 评论 -
OJ 寻找最小值
OJ 寻找最小值 题目描述思路代码题目描述思路每组的权值只需转换为求每组中相邻点之间的距离和,因此只需求出全部边的距离,进而剔除掉 m-1 个最长的距离即可。注意m=1的特殊情况。代码#include<cstdio>#include<algorithm>#include<math.h>using namespace std;int all[100050]={0};struct node{ int bian; int xu;}snode;s原创 2020-12-08 13:50:59 · 311 阅读 · 0 评论 -
CSP-20190302 | stack
CSP-20190302 | stack题目描述解题思路代码题目描述解题思路利用STL中 stack 的用法。当前读入字符为“+”,push下一数字进栈当前读入字符为“-”,push下一数字的负值进栈,此处经过验证是正确的当前读入字符为“*”,pop当前栈顶值a,push a 与下一数字的乘积进栈当前读入字符为“/”,pop当前栈顶值a,push a 除下一数字进栈直至最终将栈中所有元素相加即可。DEV c++中的调试添加变量时不支持直接查看STL容器名来获取相关信息,只能通原创 2020-12-08 09:52:10 · 176 阅读 · 0 评论 -
[TIPS] 实现四舍五入 | C++
[TIPS] 实现四舍五入 | C++对于四舍五入的实现,只需根据要实现的精确位数对如下核心代码进行改变即可。以精确到小数点后一位的四舍五入为例(如 1.25 精确后为 1.3),代码如下:float a;a=(a*10+0.5)/10;...原创 2020-11-18 20:45:50 · 101 阅读 · 0 评论 -
[TIPS] 判断一个数为整数还是小数 | C++
[TIPS] 判断一个数为整数还是小数 | C++判断一个数是整数还是小数,代码如下:bool A(float a){ if(a-(int)a==0) //核心在此a-(int)a return 0; else return 1;}原创 2020-11-18 20:42:11 · 7296 阅读 · 1 评论 -
[TIPS] 快速读入 | C++
[TIPS] 快速读入c++快速读入记录,代码如下:int read(){ int x=0;bool f=0;char c=getchar(); while (c<'0'||c>'9'){if (c=='-')f=1;c=getchar();} while (c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x;}...原创 2020-11-18 20:39:07 · 111 阅读 · 0 评论 -
P0210 合唱队形 | 最长不下降子序列
P0210 合唱队形 | 最长不下降子序列题目分析代码题目分析对每个结点进行如下两个最长不下降子序列(此处实际上为最长上升子序列)的实现:自第一个结点至该结点,最长不下降子序列 dp[i]自最后一个结点至该结点,最长不下降子序列 dp2[i]则该结点的最长不下降序列为 ans[i]=dp[i]+dp2[i] 。最后遍历所有结点的 ans ,最大值即为题目中的 K 。代码#include<cstdio>#include<algorithm>using na原创 2020-11-14 22:41:00 · 166 阅读 · 2 评论 -
CSP 202006-1 | 线性分析器
CSP 202006-1 | 线性分析器题目分析代码题目题目分析对于每条直线 li ,求其截距 pi ,通过判断经过各点与 li 平行的直线 lk 的截距 pk 与 pi 的大小,对全部点进行划分,划分成两类:pk < pipk > pi并将每个点的类别(A或B)分别存入其所属的数组,最后分别判断每个数组的元素是否相同即可。代码#include<cstdio>#include<iostream>#define FALSE 0#def原创 2020-11-05 09:03:14 · 199 阅读 · 0 评论 -
[TIPS] 判断一个数组中的元素是否相同
bool judge(int a[],int a1)//0 到 a1-1 为要判断的数组元素{ for (int i = 0;i < a1;i++) { if (a[i] != a[0]) return FALSE; } return TRUE;}原创 2020-11-05 08:48:07 · 515 阅读 · 0 评论 -
202009-2 | 风险人群筛查
202009-2 | 风险人群筛查题目分析代码题目分析注意两点:某个人可能在风险区内逗留之后,出了风险区,之后再次进入风险区逗留边界问题,注意每个变量可能的取值范围。代码原创 2020-11-04 15:21:31 · 347 阅读 · 0 评论 -
202009-1 | 称检测点查询
202009-1 | 称检测点查询题目分析代码题目分析也是sort,很简单代码#include<math.h>#include<cstdio>#include<algorithm>using namespace std;struct node { int x; int y; int dis; int nu;};node num[300];bool cmp(node a, node b){ if (a.dis != b.di原创 2020-11-01 23:39:10 · 129 阅读 · 0 评论 -
PAT1025 | PAT RANKING
PAT1025 | PAT RANKING题目分析代码题目分析sort实现排序与排名即可。(具体内容后续补充,最近太忙了QAQ)这里注意scanf_s在输入字符串时,要在变量名后加上缓冲区大小,比如scanf_s("%s %d", stu[i][p].stunum, 14, &stu[i][p].score);,这样是正确的;而scanf_s("%s %d", stu[i][p].stunum, &stu[i][p].score); 会出错。这是因为scanf_s更严格。代码原创 2020-11-01 15:45:28 · 117 阅读 · 0 评论 -
PAT B1009 | 说反话 (极简单回文串类型题目)
PAT B1009 | 说反话题目分析代码题目分析直接cin、cout就好啦。注意“ctrl+Z”结束输入。代码#include<cstdio>#include<string>#include<iostream>using namespace std;string str[100];string input;int main( ){ /*注释部分可以忽略,这是我测试c++ string系列操作的实现 int begin = 0; i原创 2020-11-01 11:30:56 · 354 阅读 · 0 评论 -
CF4298 Working out (燃烧卡路里)| 动态规划
CF4298 Working out (燃烧卡路里)| 动态规划题目分析代码题目分析设某点坐标 (i,j) ,则只需对该点到小西起点、小西终点、小瓜起点、小瓜终点的路径分别进行动态规划。进而遍历两人每一个坐标(即交点)的最大路径和,所得最大值即为所求。这里注意,两人若交于一点,则只有如下两种情况:小西自上向下走,交于该点后,仍自上向下走;小瓜自左向右走,交于该点后,仍自左至右走。小西自左至右走,交于该店后,仍自左至右走;小瓜自上向下走,交于该点后,仍自上向下走。代码#include&原创 2020-10-29 15:22:59 · 778 阅读 · 5 评论 -
折线分割平面 | 动态规划
折线分割平面 | 动态规划题目分析题目分析对于 i 条折线,记给出其分割平面数为 F[i] ,首先给出动态规划公式: F[i]=F[i-1]+4i-3 。下面给出推导说明,我们将由直线分割平面数推导得出折线分割平面数的一般规律:设有n条直线,则其对应的分割所得平面数如下:直线数内部区域数外部区域数总数1000202*20+2*2312*31+2*341+22*4(1+2)+2*451+2+32*5(1+2+3)+2原创 2020-10-28 11:31:45 · 407 阅读 · 0 评论 -
OJ 超级楼梯 |动态规划
OJ 超级楼梯 |动态规划题目分析代码题目分析同样,与上一小蜜蜂的题目一样,写出来即可发现规律。第i级台阶动态规划为F[i]=F[i-1]+F[i-2],(i≥4),对于i=1,2,3的情况,单独罗列即可。注意边界。代码#include<cstdio>int result[40] = { 0 };int main(){ result[1] = 0; result[2] = 1; result[3] = 2; for (int i = 4;i <= 40;i++)原创 2020-10-28 09:49:26 · 156 阅读 · 0 评论 -
OJ 一只小蜜蜂 | 动态规划
OJ 一只小蜜蜂 | 动态规划题目分析代码题目分析从蜂房a到蜂房b可能的路线数,其实与两蜂房的具体位置并没有关系,而只与它们之间的距离有关。可将前几年的距离列出来:距离可能的路线数1122334558……可以发现,设距离为***i*** 时,可能的路线数为 F[i] ,则自距离为3开始, F[i]=F[i-1]+F[i-2] 。另外,注意距离为0的边界情况。代码#include<cstdio>int main原创 2020-10-28 09:32:32 · 154 阅读 · 0 评论 -
PAT B1002 | D进制的A+B
PAT B1002 | D进制的A+B题目分析代码题目分析本题的实现,只需将转换为D进制的数每次按位逆序存放在数组中,之后将数组逆序输出即可。自低位向高位每位的取值为 result[i] = temp % d;,同时对temp进行操作temp = temp/d;; i++; 。需要注意两点:当结果为0时,该边界情况一定要考虑到;当a、b均取最大值时,a+b 的值为 (2^ 30 )*2=2^31-2,其实此时并未超出int的最大整数范围。代码#include<cstdio>原创 2020-10-28 00:48:14 · 84 阅读 · 0 评论 -
母牛的故事 | 动态规划
母牛的故事 | 动态规划题目分析代码问题记录题目分析刚开始画了棵树,试图以父子关系寻找每代及其孩子的数量进而得到动态规划式。但将每年牛的数量列表后:(这里默认,第1年只有母牛1头牛)年份数量112233445669713……记第i年母牛数量为 f[i] ,则 f[i]=f[i-1]+f[i-3] 。前3年的数量我们可以提前写出来,自第四年开始调用公式即可。这里注意,由于年数 n :0<n<55,这个数原创 2020-10-27 11:15:19 · 196 阅读 · 0 评论 -
OJ 数字三角形 | 动态规划
数字三角形 | 动态规划题目分析代码题目分析数据结构存储如下:对于每条路径,一定会到达底部的某一结点。一个很顺畅的思路就是从最底层的全部结点开始,向上遍历,每到达一个结点,则对该结点向上一层可能抵达的两个结点值进行判断——取较大者,形成叶子结点到该结点的最小路径,重复此过程。设结点横坐标为 i,纵坐标为 j,结点值为 temp[i][j] ,动态规划公式为 F[i,j]=temp[i][j]+max{F[i-1][j-1],F[i-1][j]} 。注意数组下标,存储数据应从“1”开始。代码原创 2020-10-27 08:05:12 · 326 阅读 · 0 评论