c++
hhyy_d
这个作者很懒,什么都没留下…
展开
-
最佳牛围栏 -- 前缀+二分(tricks)
最佳牛围栏解题思路:对于这种求最大/最小可能是多少可以采用二分法。给定一个值,判断这个值是否满足要求,如果满足,可以把平均值增大/减少。对于check函数,求平均值,因此将数组a都减去这个平均值,在给定F的情况下,只需要有连续的 >= F个数的和 >=0就存在这样的值。二分的最后要取右端点,因为l,r是浮点数,取左边的话如果值恰好能够取整,那么左边会有精度损失#include <iostream>#include <cstring>#include <a原创 2022-04-26 10:07:08 · 111 阅读 · 0 评论 -
扩充序列(找规律)
扩充序列利用arr数组首先生成2的k次方,方便后面进行计算,不过要记得开long long代码如下:#include<bits/stdc++.h>using namespace std;const int N = 60;typedef long long ll;ll n,k;ll arr[N];int fun(int sn,ll sk){ ll tmp = arr[sn]; if(sk == tmp) { return sn+1;原创 2022-03-10 15:58:40 · 248 阅读 · 0 评论 -
BFS中的Flood Fill和最短路模型
Flood Fill核心思想:对每次加进来的格子判断是否能够加入新的格子可以在线性时间复杂度内,找到某个点所在的连通块。宽搜是不会爆栈的,深搜可能会爆栈。找连通块。在算法题里面一般栈空间为1M,100000层可能就会爆。例题 :池塘计数学到一个新写法:判断八联通用两重循环for(int i = t.x-1;i<=t.x+1;i++){ for(int j=t.y-1;j<=t.y+1;j++) { if(i==t.x&&j==t.y) c原创 2022-03-09 17:08:09 · 212 阅读 · 0 评论 -
dfs剪枝与迭代加深与双向dfs
做题顺序:1.考虑如何能正确搜索出所有的方案2.再考虑剪枝1.优化搜索顺序大部分情况下,我们应该优先搜索分支较少的节点。2.排除等效冗余比如不考虑顺序的话用组合方式来搜索3.可行性剪枝如果某种方案不合法就不进行搜索4.最优性剪枝比如搜索最小值,若搜到的值已经比答案多,那就停止5.记忆化搜索...原创 2022-03-08 12:23:58 · 273 阅读 · 0 评论 -
c++写入csv文件
#include<bits/stdc++.h>using namespace std;void write(string filename,vector<vector<string> > &data){ //filename是待写入的文件名,data是保存待写文件的数据,保证filename一定存在 ofstream outFile; outFile.open(filename,ios::out); //打开这个文件 for(原创 2022-03-02 09:41:57 · 4199 阅读 · 0 评论 -
c++读取csv文件
#include<bits/stdc++.h>using namespace std;void read_csv(string filename) //传入文件所在的位置{ ifstream inFile(filename); string lineStr; vector<vector<string> > strArray;//用来保存读取出来的数据,可以看成是一个二维数组,类型一般是string,其他类型可以转换 cout<&原创 2022-03-01 23:53:26 · 7791 阅读 · 7 评论 -
关于二分一些模板
1.一般的二分模板有两套,假设a数组是一个上升数组,待查找的为x。//查找第一个出现的x,如果没有x则输出待插入的位置。int search(int l,int r,int x){ while(l<r) { int mid = (l+r) / 2; if(a[mid]>=x) r = mid; else l = mid+1; } if(a[l]<x) return l+1; else return原创 2022-02-23 21:47:34 · 90 阅读 · 0 评论 -
旅行家的预算(洛谷)
题目链接:旅行家的预算解题思路:题目的目标是求出最小的油费,如果我们知道在每个加油站都加了多少升油,那就可以求出油费了,最小也就意味着在每个加油站加的油最合适。思考什么叫做合适,假设我当前处在第index个加油站(起始在第0个),如果我把油加满了,最远能走到的距离假设为maxdist,如果从当前加油站到maxdist中还有其他加油站的邮费比当前加油站油费低,那我就可以走到那个加油站(next)进行加油,我在index加的油刚好走到next就行。解题过程:上面是本题的关键思路,在解题过程中需要考虑多中情况原创 2022-02-23 18:15:03 · 486 阅读 · 0 评论 -
关于背包问题的总结
背包问题的分类:1. 01背包问题2. 完全背包问题3. 多重背包问题4. 完全背包问题DP问题的解题思路:01背包问题问题描述:见例题:01背包问题问题分析:对于每一个物品,可以选择要也可以选择。所以状态的计算就是更新i所表示的集合,因此,f(i,j) = max(f[i-1][j],f[i-1][j-v[i]]+w[i])。这就是朴素版的01背包问题,代码如下:#include<bits/stdc++.h>using namespace std;const原创 2022-02-10 22:20:32 · 1044 阅读 · 0 评论 -
P1318 积水面积
解题思路:对于每一个点,去往前找比它大的第一个数,去往后找比他大的第一个数,然后算min(arr[left]-arr[i],arr[right]-arr[i]),答案加上这个值乘以(right-left-1),如果在往前找的时候,发现某个数和他相等,那么说明之前已经处理过了,就不处理了,直接返回。#include<bits/stdc++.h>#define MAX 10001using namespace std;int n;int arr[MAX];long long res=..原创 2021-12-04 16:26:00 · 807 阅读 · 0 评论 -
P1160 队列安排
解题思路:用双向链表进行模拟,为了能够快速找到每个序号对应的节点位置,用一个unordered_map<int,Node*>进行维护,代码如下:#include<bits/stdc++.h>#define MAX 100001using namespace std;struct Node{ int data; Node *right; Node *left;};int n,m;int visited[MAX];unordered_map&..原创 2021-12-03 12:59:23 · 223 阅读 · 0 评论 -
P1077 [NOIP2012 普及组] 摆花
暴力递归如何到记忆化搜索原创 2021-12-02 20:13:07 · 1117 阅读 · 0 评论 -
P1061 [NOIP2006 普及组] Jam 的计数法
解题思路:对于每一个字符串,判断第n-1个位置能不能放,如果不能再去前面找,如果可以,就把从当前位置开始,所有的值都往后加一位。这里我用一个map维护数字与字符之间的映射,方便查找。发现规律:倒数第i位数的值不会超过t+1-i。#include<bits/stdc++.h>#define MAX 27using namespace std;int s,t,w;vector<int> arr;//存储字符串对应的位置map<int,char> mp;//维护..原创 2021-12-02 16:47:21 · 1201 阅读 · 0 评论 -
四数之后(暴力)
解题思路:排序后固定前两个值,去查看后面的序列中有无满足target-cursum的答案,用map(unorder_map)来标识前两个值唯一,代码性能不太行,代码如下:class Solution {public: map<pair<int,int>,int> mp; vector<vector<int> > res; void append(int &x,int &y) { mp[mak.原创 2021-11-25 23:27:40 · 747 阅读 · 0 评论 -
P1057 [NOIP2008 普及组] 传球游戏
解题思路:1.40分做法:采用dfs进行遍历,当满足传球次数达到m次的时候检验此时球在不在第一个同学手里。图示:原创 2021-11-04 18:24:06 · 2357 阅读 · 0 评论 -
输出集合的子集(上一篇续)
本篇用A[i]表示A数组中第i个元素表示的是原数组中第i个下标。第一种方法:增量构造法void fun1(gg cur,gg A[])//生成子集的第一种方法,增量构造法{ for(int i=0;i<cur;i++) { cout<<vi[A[i]]<<" ";//A[i]是下标,所以输出的时候把输入数组加上 } cout<<"\n"; int s = cur?A[cur-1]+1:0;//这里因为当前cur已经原创 2021-10-26 21:17:34 · 105 阅读 · 0 评论 -
c++全排列问题(暴力基础)
有两种有序排列,第一种,输入的数字无重复,第二种,输入的数字有重复,要求输出没有重复的全排列。针对第一种,思路如下:排列类问题想到的是递归进行处理,递归边界就是当前序列的个数等于输入序列的个数。枚举输入序列中的每一个值,如果这个值在当前序列中没有出现,则把A[cur]=vi[i],如果出现了,则跳过。第二种:在有重复数字的问题中,下标i应该不遗漏不重复的取到所有的vi[i],在对生成的序列去重的时候可以在for循环中加入一个条件,if(vi[i]!=vi[i-1])则可以达到效果。其次,当当前序列中原创 2021-10-26 20:24:22 · 1159 阅读 · 0 评论 -
Z字形扫描
问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:对于下面的4×4的矩阵, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 对其进行Z字形扫描后得到长度为16的序列: 1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3 请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。输入格式 输入的第一行包含一个整数n,表示原创 2021-10-25 00:57:44 · 425 阅读 · 1 评论 -
关于c++的一些小技巧
1.#include<bits/stdc++.h>//万能头文件。首行加入词文件后不用再包含比如vector等头文件2.关于string转intstring str="123";int num=atoi(str.c_str());3.关于char转stringchar a='b';string str=string(1,a);原创 2021-08-26 16:02:48 · 58 阅读 · 0 评论 -
计数质数(c++)
统计所有小于非负整数 n 的质数的数量。示例 1:输入:n = 10输出:4解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2:输入:n = 0输出:0示例 3:输入:n = 1输出:0提示:0 <= n <= 5 * 106解题思路:如果一个数是质数,则它的倍数一定是合数,把合数去掉。class Solution {public: int countPrimes(int n) { int ans = 0;原创 2021-08-15 15:57:30 · 434 阅读 · 0 评论 -
盛最多水的容器(c++)
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输入:height原创 2021-08-12 15:04:36 · 710 阅读 · 0 评论 -
矩阵的翻转问题
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例 1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]解题思路:如果是顺时针旋转90度:则先对角线旋转(左上到右下),在进行水平交换。如果是逆时针旋转90度:则先水平交换,在进行对角线旋转。代码如下:class Solution {原创 2021-08-08 16:35:49 · 218 阅读 · 0 评论 -
合并区间(c++)
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入:intervals = [[1,4],[4,5]]原创 2021-08-07 23:08:17 · 1885 阅读 · 0 评论 -
爬楼梯(c++,动态规划)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶我的解题思路:像斐波拉契数列那样,fun(n)=fun(n-1)+fun(n-2),但是当递归次数过多的会超时;原创 2021-08-06 20:16:14 · 725 阅读 · 0 评论 -
01矩阵(c++ bfs解法)
01 矩阵给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例 1:输入:mat = [[0,0,0],[0,1,0],[0,0,0]]输出:[[0,0,0],[0,1,0],[0,0,0]]示例 2:输入:mat = [[0,0,0],[0,1,0],[1,1,1]]输出:[[0,0,0],[0,1,0],[1,2,1]]提示:m == mat.lengthn ==原创 2021-08-05 22:23:19 · 1199 阅读 · 0 评论 -
每日温度(c++)
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例 1:输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]示例 2:输入: temperatures = [30,40,50,60]输出: [1,1,1,0]示例 3:输入: temperatures = [30,60,90]输出: [1,1,0]提示:1 &原创 2021-08-04 18:26:21 · 750 阅读 · 0 评论 -
完全平方数(c++bfs解法)
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例 1:输入:n = 12输出:3解释:12 = 4 + 4 + 4示例 2:输入:n = 13输出:2解释:13 = 4 + 9提示:原创 2021-08-04 17:10:44 · 1557 阅读 · 0 评论 -
二叉树序列化和反序列化(层序遍历创建二叉树)
二叉树的序列化与反序列化序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种原创 2021-08-03 19:13:03 · 417 阅读 · 0 评论 -
二叉树最近的公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。解题思路:先寻找每个节点的祖先,然后遍历每个节点的祖先,找到第一个相同的点原创 2021-08-03 16:54:15 · 76 阅读 · 0 评论 -
c++两个大整数相加
#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char str1[10000];char str2[10000];struct bign{ int d[10000]; int len; bign()//初始化 { memset(d,0,sizeof(d));/原创 2021-07-26 16:53:28 · 351 阅读 · 0 评论 -
c++字符数组与整数之间的转换
将"12"转化为12,将21转化为"21"#include <iostream>#include<stdio.h>#include<string.h>using namespace std;int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); char a[3]="12"; int n=0; sscanf(a,"%d",&n); //将a中的数写原创 2021-07-26 15:38:53 · 1105 阅读 · 0 评论 -
c++取消同步,快速输入
#include <iostream>using namespace std;int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}原创 2021-07-26 15:11:24 · 248 阅读 · 0 评论