[NOIP2017 TG D2T2]宝藏】的更多相关文章

题目大意:$NOIPD2T2$宝藏 题解:正常做法:状压DP .这次模拟退火,随机一个排列,$O(n^2)$贪心按排列的顺序加入生成树 卡点:没开$long\;long$,接受较劣解时判断打错,没判$n=1​$的情况 C++ Code: #include <cstdio> #include <cmath> #include <algorithm> #include <ctime> #include <cstdlib> #define maxn 1…
题目大意:给定一个有重边,边有权值的无向图.从某一个点出发,求到达所有的点需要的最少费用,并且限制两点之间只有一条路径.费用的计算公式为:所有边的费用之和.而边$x->y$的费用就为:$y$到初始点的之间点的个数(包括起始点) $\times$ 边权. 题解:状压$DP$,令$f_{i,j}$表示当前深度为$i$,状态为$j$的最小花费 $$f_{i,s}=f_{i-1,t}+g_{s,t}\times(i−1)$$ 再开一个数组$c_{s,i}表示状态$s$挖到点$i$的最小花费(不考虑深度)…
列队,NOIP2017 TG D2T3. 树状数组经典题. 题目链接:洛谷. 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有\(n \times m\)名学生,方阵的行数为 \(n\),列数为 \(m\). 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从 \(1\) 到 \(n \times m\) 编上了号码(参见后面的样例).即:初始时,第 \(i\) 行…
题目大意:$NOIP2018\;TG\;D2T2$ 题解:在skip2004的博客基础上修改的,也是暴搜. 说明一下把vector改成数组并不可以通过此题,记录. 结论:在$m>n+1$时答案为$3(n,m)$($(n,m)$表示长$m$高$n$的矩形的答案) 发现其中判断右下角矩阵斜线全相等的部分可以优化,因为对于一条斜线,每次都搜右下角的矩阵,有很多部分都是重复搜的,完全可以每次搜只与它下面的一层比较,发现一条斜线中最多只有一个$01$交界处,于是对于这一行进行特判,少搜一个,但是注意最下面…
考场上写的prim一遍过了大样例也没想什么别的,反例也没举出来. 后来才知道由于要乘上深度所以无法贪心. 正解是状压但我不会,考后一个爆搜碾过去了. 心凉. #include<bits/stdc++.h> using namespace std; int n,m,tmp;long long ans=1e15; ; <<]; ][],d[]; void dfs(int now) { if(f[now]>ans)return ; if(now==tmp) { ans=min(an…
洛谷P3959 其实就是一道暴力搜索题……只是需要一个状态压缩的剪枝比较难想而已 这根本不叫dfs!只是一个递归而已……开始就被dfs坑了 思路: 首先一个基本的预处理 数据范围n≤12,m≤5000,说明肯定有很多没用的边,在读入的时候预处理掉就可以了,另外n很小可以用邻接矩阵存图访问快 解法一:暴力搜索 直接暴力搜索,开一个数组记录一个点有没有被访问过.每到一个状态,从访问过的点到未访问过的点引边算代价,递归枚举一下即可.但此方法时间复杂度较大,大约为O(n^n)?(没有仔细算),n<=8差…
嗨小朋友们大家好,还记得我是谁吗?我就是为GG代言的蒟蒻--xzz 今天呐我特别的要向HN的dalao们ZJ的巨佬们还有全国的神犇们问声好 为什么呢因为我们在2017年11月份来到了吔屎的长沙理工大学云塘校区与CCF和神犇们做现场的交♂易 在这次交易中呢发生了一个非常有趣的事下面我就跟大家讲♂一讲 步入正题 联赛爆零,初三退役 --AFO 鉴于有一等我还是补一下吧 Day0 上午敲kmp,manacher.没考到 下午谈完人生以后就去颓2048了 晚上想颓舞线没颓,用笔记本颓2048 Day1…
题目大意:有一个$n \times m$的方阵,第$i$行第$j$列的人的编号是$(i-1) \times m + j$. 现在有$q$个出列操作,每次让一个人出列,然后让这个人所在行向左看齐,再让最后一列向前看齐,最后让这个人站到第$n$行第$m$列的位置. 你需要输出每次出列的人的编号. 题解:可以每行维护一棵平衡树,再给最后一列维护一棵平衡树(虽然正解是用树状数组). 发现每行的人初始编号是连续的,而对于$9 \times 10 ^ {10}$的人数,$3 \times 10 ^ {5}$…
解析 我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去枚举每个起点,那么我们可以定义状态 $ f[i] $ 表示当前状态为 $ i $ 的时候最小花费,那么我们可以写出状态转移方程 $ f[x|(1<<(j-1))]=min(f[x]+dis[i]* d[i][j],f[x|(1<<(j-1))]) $ ((1<<(j-1))…
$O(n*3^n)$好难想...还有好多没见过的操作 令$f[i][j]$表示最深深度为i,点的状态为j的最小代价,每次枚举状态$S$后,计算$S$的补集里的每个点与S里的点的最小连边代价,再$O(3^n)$枚举S补集的子集,$g[x]$表示补集里状态为x的点往S集合里的点连边的最小代价,然后转移的时候加上它就好. 但是$g[x]$怎么处理呢...处理不好就会变成$O(3^n*n^2)$了,当然也可以预处理,但是有更简单的方法.因为我们枚举补集的时候是按顺序的,当前状态去掉最低位的状态一定是算过…