字串变换(双向BFS)

思路:最小步数模型用BFS去写,但是子串变换的可能是k种那么10步,就是的空间k^10会爆内存,那么用双向广搜优化,A,B同时变化,我们在同一层看有没有A,B可以相互到达的点,如果有那么就是A的距离+B的距离+1,没有就加入搜索,直到这一层搜完。保持两队列大小差不多,当A的小了就去搜A反之//#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define .
分类: 其他 发布时间: 01-26 22:34 阅读次数: 0

第K短路(A*)

思路:要找第K短路,暴力的话就是bfs搜索每一个可以到达的点,那么第K个到终点的距离就是第K短路,这样铁T,对于这种搜索的点巨多的就用A*,A*在最短路问题中,如果所有的边权非负,那么就可以用启发函数来优化bfs过程启发函数是一种函数用来估算当前状态和 目标状态之间的距离,用于路径决策。也就是说,该函数的IQ直接决定了寻找路径的快慢和准确度(accuracy)我们吧f(s)作为启发函数(s到目标点的估算距离),g(s)是从s到目标点的实际距离,要满足f(s)<=g(s),就可以保证当.
分类: 其他 发布时间: 01-26 22:34 阅读次数: 0

八数码(A*)

思路:这个题可以直接用BFS写,这里用的A*,八数码有个性质是当且仅当逆序数数对是奇数时无解,利用这个性质判断无解的情况,然后写A*,这里我们要看启发函数f(x),f(x)是到最终状态的距离,本题中可以发现当前每个数到最终态的走向只能是左右或者上线移动那么至少要走的就是每个数到终态的曼哈顿距离。我们知道了启发函数剩下就是写关于这个题的最短路,用unordered_map去记录距离和状态,还要记录来的时候的路径。#pragma GCC optimize(2)#include<bits/stdc++.
分类: 其他 发布时间: 01-26 22:33 阅读次数: 0

数独(二进制优化)

思路:暴力数独就是判断行列和3X3的方格内没有重复的数就填一个,这样暴力搜,我们可以发现可用通过一个9位的二进制串表示行列或者3x3的方格内的数有没有用过,比如row[0]=111111111,就表示第1行中1,2,3…,9都没用过,列也相同,3x3的方格表示的特殊一点,原来是9X9的方格,现在我们只需要用个2进制串就能表示一个3X3的方格中的数有没有用过那么我们就可以吧原来的缩成9X9的缩小成3X3的用下标进行映射对应块,所以初始化我们吧这个3个的值都置为全1(1<<9)-1,我们发现在原图.
分类: 其他 发布时间: 01-26 22:33 阅读次数: 0

生日蛋糕(剪枝)

思路:我们从下往上搜索,也就是从体积和表面积大的向上搜索,我们用R[i]和H[i]记录每一层的高度和半径,在枚举r和h的过程要注意他的取值范围。最小不能小于当前层数,每一层的h,r要小于他下面内层。然后就是剪枝。1. 到目前为止是体积+这一层的体积不能大于总体积。2.到目前为止的面积+这一层的面积不能大于总面积。3.可以通过剩余的体积得出与最小侧面积的不等式。n−v=∑i=0depr[i]2h[i]n-v=\sum_{i=0}^{dep} r[i]^2 h[i]n−v=∑i=0dep​r[i]2.
分类: 其他 发布时间: 01-26 22:32 阅读次数: 0

加成序列(迭代加深)

思路:满足题设的4个条件,第一个数一定是1,最后的数一定是n,数列单调递增,后面的数是由前面某2个数相加得来的。其中一些条件可以作为可行性剪枝,搜索时,我们去从小到大逐层搜m,因为条件4的的存在,我们会发现如1 2 3 5这种答案和1 2 4 5都是可行的,5可由2+3或者1+4得来那么我们就需要标记一下防止重复搜索。#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long.
分类: 其他 发布时间: 01-26 22:32 阅读次数: 0

送礼物

思路:看题是个背包,但是W的范围太大,那么就去搜索他的所有方案看哪个最大,这样呢直接搜2462^{46}246会T,那么就通过打表,先求出前一半物品的可行重量方案,然后在搜后半部分,然后去找在背包容量内前一部分有没有合适的方案(这里知道了后部分的可行重量,和总的容纳重量,二分去找前一半中最大可行的是哪一个)。#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;.
分类: 其他 发布时间: 01-26 22:32 阅读次数: 0

排书(IDA*)

思考:可以抽象为最短路问题,用IDA*做。我们就需要一个估价函数,估价函数要不大于实际步数。我们发现每当进行一次修改就会改变3个地方的后继,当有序时每个数和他的后继满足a[i+1]=a[i]+1,所以我们就可以得出将这个序列修改至有序需要进行几次修改,那么我们就把他当做估价函数,f()=⌈tot3⌉f()=\lceil \frac{tot}3\rceilf()=⌈3tot​⌉,我们去枚举的他的修改次数进行迭代加深,当估价函数算出的步数和已经走过的步数加起来大于最大可走的步数无解,估价函数为0表示有解。#.
分类: 其他 发布时间: 01-26 22:32 阅读次数: 0

回转游戏(IDA*)

思路:求最小的操作数,我们发现每次操作都有4种选择搜索树会很深,那么按操作数去搜索,用IDA*。从题中我们可以看出来这个输入和对应的下标是这样的,在就行8种操作时我们可以发现,他每次操作只会改变一个数的位置,我们先求一下中间8个数中哪个数出现最多为res,那么我们最少最要的操作数就是8-res,吧他作为估价函数。因为求最小的操作数,所以逆操作比如先A后F这样相当于没有变化,所以我们记录一下每种操作对应的逆操作。用下标对应就是0(A)的逆操作是5(F),为了方便移动数字,我们就先把8个操作对应的要修改的.
分类: 其他 发布时间: 01-26 22:31 阅读次数: 0

新年好(最短路+dfs)

思路:先用最短路预处理一下去亲戚家的最短距离,然后暴力搜索最短的拜访顺序。#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root&.
分类: 其他 发布时间: 01-26 22:31 阅读次数: 0

通信线路(二分+最短路)

思路:从题意可以看出是求在一个从1——N的路径从第k+1条边的最大值最小,一看这最大值最小想到二分,我们发现答案可能是0(当1-n的路径经过的变数小于等于K时)也可能是没有解-1。所以我们二分时从0——1e6+1起,如果答案是1e6+1说明无解,然后我们不断二分出第K+1条边权x,然后在原图跑最短路,根据题意我们可以吧大于x的边权视为1,其他是0,这样我们就能知道当第k+1条边的权值为x时,有没有大于x的边数小于等于K,如果有说明我们的x还能往小继续二分。知道求出最优解。代码:#pragma GCC .
分类: 其他 发布时间: 01-26 22:31 阅读次数: 0

最优贸易(最短路)

思路:我们要求的是最大差价,那么比如我们在K处交易那么就是从1到K期间我们买入最低价格的水晶球,从K到N我们以最高价格卖出。那么我们就从1-N跑一次最短路,最短路更新条件是水晶球的最低价格,然后从反向从K-N跑一遍最短路,更新条件是水晶球的最贵价格。然后枚举K算出最大差价#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::io.
分类: 其他 发布时间: 01-26 22:31 阅读次数: 0

选择最佳线路(建立虚拟源点)

思路:问你从多个源点出发到终点的最短路线,那么我们建立一个虚拟源点和其他车站连起来权值为0,求从这个虚拟源点到终点的最短路(记得初始化tot)。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#defin.
分类: 其他 发布时间: 01-26 22:30 阅读次数: 0

拯救大兵瑞恩(最短路,状态压缩)

思路:要找到到达N,M点的最短距离,当有门时需要用对应的钥匙开门,那么我们用dis[i][j]表示在编号i位置时此时持有钥匙的状态是j的最短距离。根据钥匙的编号id我们初始化Key的状态为Key=1<<id-1 ,我们可以发现当该位置有钥匙时,我们的状态就要发生改变state=state(原)|key然后看是否需要更新dis可得转移方程dis[i][state]=dis[i][state(原)|key],然后就是上下左右移动,在移动时我们需要判断有门的情况,当有门时,我们要判断在该位置上我们此.
分类: 其他 发布时间: 01-26 22:30 阅读次数: 0

最短计数

思路:因为权值都是1,那么直接用BFS找对最短路就行了,在BFS的时候我们用cnt[i]记录到i位置的最短路的数量,在可以更新最短距离的时候,更新cnt[i]的值,如果找到了相同的距离那么就加上另一条路径的数量。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#define SIS std::ios::sync_with_stdio(false).
分类: 其他 发布时间: 01-26 22:30 阅读次数: 0

观光(统计最短路,次短路条数)

思路:问最短路和次短路的条数和,并且次短路只比最短路多1,我们在dijkstra时进行统计和更新,用dis[i][0]表示到i点的最短距离用dis[i][1]表示到i点的次短距离,用cnt[i][0]表示到i的最短路径的条数,用cnt[i][1]表示到i的次短路径条数,当我们到 i 点最短路需要更新时,那么原来到 i 的最短路就会变成次短路,先更新一下次短路的距离,此时到 i 次短路的条数也是就变成了之前到 i 的最短路条数,然后我们再更新最短路的距离,最短路的次数也更新,当我们发现和最短路距离相同则我们.
分类: 其他 发布时间: 01-26 22:29 阅读次数: 0

牛的旅行(Floyd应用)

思路:根据题意我们要求牧场中最短路最长的是多少,首先如果只有一个牧场那么我们只需要跑一遍最短路然后,求各个点直接的最短距离最长是多少,我们用mxd[i]表示i点到其他点的最短距离最长是多少。如果需要连接牧场的话,我们就要枚举牧场之间的连接点,当dis[i][j]==inf时说明可以连边,此时我们找连边尽可能小的使得mxd[i]+dis[i][j]+mxd[j]尽可能小,最后看这2个哪个大就是要求的直径。#pragma GCC optimize(2)#include<bits/stdc++.h&g.
分类: 其他 发布时间: 01-26 22:29 阅读次数: 0

排序(floyd应用)

思路:只有一种关系,我们用这种关系做传递闭包,我们用floyd完成传递闭包运算。然后我们判断点之间的关系,dis[i][j]==1表示i<j关系存在,如果发生矛盾我们判断dis[i][i]是否为1,如果无法判断关系则说明dis[i][j]==dis[j][i]==0,否则关系判断无误。代码:#pragma GCC optimize(2)#include<bits/stdc++.h> using namespace std;typedef long long ll;#defi.
分类: 其他 发布时间: 01-26 22:29 阅读次数: 0

android9.0源码来电屏蔽

首先,通过获取TelephonyManage,第二继承PhoneStateListener 监听电话状态的变化,执行判断哪个地方需要此功能加registerphone(this||***.this) public void registerphone(Context context) { mPhoneStateListener = new PhoneCallListener...
分类: 其他 发布时间: 01-26 22:29 阅读次数: 0

Android 10辅助服务无法自动跳转到其他界面解决办法

android 10发布时就对应用的Activity的权限进行了更严格的处理,具体看文档去。https://developer.android.google.cn/about/versions/10/privacy/changes#app-access-device-location解决办法:应用必须获取用户的应用悬浮窗权限,获取后就能自由的跳转了。<uses-permission ...
分类: 其他 发布时间: 01-26 22:29 阅读次数: 0