基本算法
搜索、排序、暴力等基本算法
饮闲
写作是门孤独的手艺,意义却在于分享
展开
-
阿里巴巴校园招聘——灵犀互娱、游戏研发工程师、一面面经
今天下午,参加了阿里巴巴、灵犀互娱、游戏研发工程师的一面,感觉提问的问题不是很难,但是可能基础不是很好,并且游戏这方面接触的也比较少,所以面试的表现不是很好。面试集中在以下几个方面:1. C++基础知识构造函数是否可以作为虚函数?答案:构造函数是不可以作为虚函数的。为什么呢?因为构造函数是,需要确定对象的类型,而虚函数是在运行期间确定类型的,因此编译器无法知道是要构造基类对象,还是构造派生类的对象,因此构造函数不可以是虚函数。虚函数的执行依赖于虚函数表,而虚函数表是在构造函数中进行初始化工作原创 2021-08-11 22:30:22 · 2273 阅读 · 1 评论 -
背包问题你们见过吧。但是超大背包问题怎么搞呢?
题目n个物品,重量w[i],对应的价值为v[i],从这些物品中挑选重量不超过W的物品,求价值总和最高的方案。1 <= n <= 401 <= w,v <= 10^151 <= W <= 10^15解析背包问题用动态规划求解,复杂度O(nW),但是这里W的范围太大了,搞不了。不过这里面的n范围比较小,可以考虑从n下手。n的大小为40,2^40超出限制,考虑利用折半查询的方式,先折半前一部分的所有可能性,然后排序,剪枝掉一定不会选择的组合,即重量大,价值小原创 2021-08-05 12:00:38 · 770 阅读 · 0 评论 -
折半枚举(双向搜索) —— 4 Values whose Sum is 0 POJ - 2785 题解
题目链接https://vjudge.net/problem/POJ-2785题目简述有ABCD四个数组,从每个数组中选取出一个元素,求和为0的所有组合总数。题目解析每个都枚举肯定是不行的,复杂度O(n^4).可以考虑独立出一个来,然后求A+B+C的和,然后对D排序,二分搜索D的值,复杂度O(n^3 * log(n)),不太够,再度优化可以看成 a + b = - c - d先求C+D的和,看做一个新的数组cd,对cd排序然后枚举A+B,再二分搜索cd的值,时间复杂度O(n^2原创 2021-08-04 17:07:25 · 198 阅读 · 0 评论 -
集合的整数表示——二进制表示法
使用情况只有当集合中的元素比较少的时候,才能用这种方法来表示。原理f(S) = sum(2^i),其中,i为属于集合的元素的所有下标。用法空集 —— 0只含第i个元素的集合 —— 1<<i含有从0到n-1这n个元素的集合 —— (1<<n) - 1判断第i个元素是否属于集合S —— if (S >> i & 1)向集合中加入第i个元素 —— S | 1 << i从集合中去除第i个元素 —— S & ~(1 <<原创 2021-08-03 06:00:11 · 551 阅读 · 0 评论 -
Fliptile POJ - 3279 题解优美的暴力
题目链接https://vjudge.net/problem/POJ-3279拿到这道题想了很久,都没找到什么好的做饭,一看题解,好家伙,直接暴力是没想到的,一看数据最多才15行15列,之间暴力就OK了。首先,暴力第一行的所有可能性,2的15次方,大概32768种可能性。只要第一行确定下来了,之后的情况都可以之间根据上一行来锁定出下一行,然后确定出整个矩阵的最优解。注意,同样踩踏次数的可能性下,要选择字典序最小的那种踩踏情况,所以要从最小的数0开始,一直确定到最大的数2的15次方。AC代码原创 2021-08-02 16:58:10 · 278 阅读 · 0 评论 -
Face The Right Way POJ - 3276 题解
题目链接https://vjudge.net/problem/POJ-3276开关问题K为反转块的大小,M为反转的次数(要求在最小的反转次数内,选择最小的反转块)我们,首先从小到大遍历所有的单位块K,这样能保证在选择最小的反转次数M的同时,只会保留最小的块数K。对于每一个可能的K值,如果能满足条件,则turn函数返回需要反转的次数,如果反转的次数比当前值要小,则更新最小的M,因为K是保证在最小M前提下的K,所以也要同时更新K值。在turn函数的每一次处理中,以块为单位的思想进行推进,记原创 2021-08-02 15:01:57 · 244 阅读 · 0 评论 -
Jessica‘s Reading Problem POJ - 3320 题解 双指针,set,map
题目链接https://vjudge.net/problem/POJ-3320代码#include <iostream>#include <set>#include <map>using namespace std;int P;const int MAX_P = 1000000;int a[MAX_P];void solve(){ set<int> all; for (int i = 0; i < P; +原创 2021-08-02 12:51:26 · 204 阅读 · 0 评论 -
POJ 3061 Subsequence 题解 法一: 二分 + 遍历 法二:双指针
代码#include <iostream>#include <algorithm>using namespace std;int N, S;const int MAX_N = 100000;int A[MAX_N];int sum[MAX_N];void solve(){ sum[0] = A[0]; for (int i = 1; i < N; ++i) { sum[i] = sum[i - 1] + A[i]; } int res =原创 2021-07-30 17:29:24 · 211 阅读 · 0 评论 -
Aggressive cows POJ - 2456 题解
题目链接点击这里代码#include <iostream>#include <algorithm>using namespace std;int N, M;const int MAX_N = 100000;int X[MAX_N];bool try_place(int mid){ int pre = 0; int cnt = 1; for (int i = 1; i < N; ++i) { if (X[i] - X[pre] >= m原创 2021-07-30 15:34:46 · 220 阅读 · 0 评论 -
Cable master POJ - 1064 题解
题目链接https://vjudge.net/problem/POJ-1064当然我是在Virtual Judge上面写的,可以直接去POJ去提交。这个题目感觉并不是很困难的样子,主要就是一个二分的思想,之前写的时候,主要是结尾判断的时候,没有向下取整,直接四舍五入的,导致一直提交失败,甚至写了不只一个版本的代码。下面,我随便给出两个版本的结果,都能过。#include <iostream>#include <cstdio>#include <cmath>原创 2021-07-30 10:03:42 · 419 阅读 · 1 评论 -
AIZU ALDS1-ALDS1_4_B Binary Search 二分搜索 Java实现
简单的二分搜索题目题目链接AC代码package AIZU;import java.util.Scanner;class t2 { static int a[] = new int[100000]; static int b[] = new int[50000]; public static int binarySearch(int a[],int left,int right,int key) { while(left<=right) { int mid=(l原创 2020-10-28 19:43:04 · 256 阅读 · 0 评论 -
java入门学习笔记(七)——数组、杨辉三角、冒泡排序、选择排序、二分查找。复杂类与对象的简介、定义与构造方法、方法继承、覆盖、重载、多态、异类集合、final关键字
重要的结构数组,以及相应的冒泡、选择等简单排序及二分查找的应用,同时,还有类与对象的相关知识。原创 2020-09-27 16:04:58 · 480 阅读 · 0 评论 -
扩散-并查集-二分
n1#include <iostream>#include <cstdio>#include <cmath>using namespace std;/*432 1921 1444 248 13*/int n;struct node{ int x,y;}a[55];int d[55][55];int fa[55];int juli(int i,int j){ return abs(a[i].x-a[j].x)原创 2020-09-02 19:24:42 · 260 阅读 · 0 评论 -
kmp的实现——简单算法
#include <iostream>#include <cstdio>#include <iostream>#include <cstring>#include <string>using namespace std;const int inf = 0x3f3f3f3f;const int maxn = 2005;#define eps 1e-8#define INIT(x) memset(x,0,sizeof(x))ty原创 2020-09-02 15:08:01 · 220 阅读 · 0 评论 -
最长公共子序列的简单实现 模板
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 5 using namespace std; 6 7 const int max_n = 1000+10; 8 9 int n,m;10 char s[max_n],t[max_n];11 in...原创 2020-02-03 20:58:00 · 204 阅读 · 0 评论 -
完全背包问题的简单实现
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 const int max_n = 100+2; 8 const int max_W = 10000+2; 9 10 int n,W;11 i...原创 2020-02-04 10:21:00 · 228 阅读 · 0 评论 -
简简单单的汉诺问题
#include <iostream>using namespace std;int main(){ void han_move(int n,char a,char b,char c); int n=1; char a='A',b='B',c='C'; han_move(n,a,b,c); return 0;}void han_move(int n,char a,char b,char c){ if(n==1){原创 2020-08-29 16:26:03 · 211 阅读 · 0 评论 -
简简单单的快速排序
#include <iostream>using namespace std;void Qsort(int a[],int low,int high){ if(low>high){ return; } int key=a[low]; int first=low,last=high; while(first<last) { while(first<last && a[last原创 2020-08-29 16:22:54 · 216 阅读 · 0 评论 -
简单的稠密图求最小生成树
啊哈算法学习笔记,简单的稠密图求最小生成树问题#include <cstdio>using namespace std;const int inf = 0x7fffffff;int n;int a[500][500];int dis[500];int prim(){ int ans=0,cnt=0; int k,min_road; ++cnt; for(int i=0;i<n;++i) { dis[i]=a原创 2020-08-27 20:58:25 · 1489 阅读 · 0 评论 -
选择排序 ALDS1_2_C
选择排序法与上述两种相比虽然可能数据交换的次数减少了不少但是,却是不稳定的排序算法。#include <cstdio>#include <iostream>using namespace std;const int max_n=36;int n;pair<char,int> P[max_n],P2[max_n],tmp;void Bubble_sort(){ bool flag=true; for(int i=0;i<n-原创 2020-08-02 21:00:29 · 205 阅读 · 0 评论 -
选择排序 ALDS1_2_B
选择排序法与上述两种相比虽然可能数据交换的次数减少了不少但是,却是不稳定的排序算法。#include <iostream>#include <cstdio>using namespace std;const int max_n=100;int n;int a[max_n];int Select_sort(int a[],int n){ int cnt=0; for(int i=0;i<n-1;++i) { in原创 2020-08-02 20:59:29 · 224 阅读 · 0 评论 -
冒泡排序 ALDS1_2_A
也是一种稳定的排序法利用了相邻两元素之间的交换对于有序序列,执行效率较高。交换次数,为逆序数,反映了数据的复杂程度。注意要有清晰的程序设计思路,尽量一次写出,避免调试错误。#include <iostream>#include <cstdio>using namespace std;const int max_n=100;int a[max_n];int bubble_sort(int a[],int n){ int cnt=0; boo原创 2020-08-02 20:56:38 · 275 阅读 · 0 评论 -
ALDS1_1_A 插入排序
插入法是一种稳定的算法他的优势在于,可以高效的处理较为稳定的数据。如果数据集基本稳定,插入法的复杂度基本为O(n)。但是对于不稳定的数据,插入法的最坏时间复杂度,达到了O(n^2)因此,需要结合其他排序法来使用。单一的排序算法,或者固定的排序函数,能满足数据处理的基本要求,但无法最为高效的处理数据,因此在处理问题的过程中,学习、了解、并灵活使用多种排序算法,是即为重要的,也是程序设计的基础算法之一,尝尝作为高级算法的子步骤。算法内容其实很简单,但看了别人的编程之后,我发觉用函数进行模块化编程对于原创 2020-08-02 20:52:40 · 294 阅读 · 0 评论 -
希尔排序 ALDS1_2_D
这个算法实现起来花了一些时间,主要错误出在临近问题上,有运行时错误调试了不短的时间。这个算法对比之前的几类算法,运行复杂度是都有所降低,如果去g=3*g+1,这个算法的复杂度维持在O(N^1.25)左右,对比之下,这是一个高效的算法,十分值得学习与借鉴。有利于对数据进行灵活的排序处理#include <iostream>#include <cstdio>#include <vector>using namespace std;const int max_原创 2020-08-02 20:47:54 · 248 阅读 · 0 评论 -
POJ 1753 Flip Game 暴力 深搜
POJ 1753 Flip Game 暴力 深搜题目链接Flip GameTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 59468 Accepted: 24750DescriptionFlip game is played on a rectangular 4x4 field with two-sided p...原创 2020-03-10 17:37:40 · 334 阅读 · 0 评论