![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
TC
nanhan27
高中生
展开
-
SRM 516 NetworkXMessageRecovery
【分析】 这一道其实没什么好讲的,还是比较裸的拓扑排序。【代码】#define M 255class NetworkXMessageRecovery { public: int mp[M][M]; int in[M],mk[M],have[M]; string ans; bool chk(int x){ return !in[x]&&!mk[x]&&原创 2017-01-24 16:09:08 · 219 阅读 · 0 评论 -
SRM593 Div1Medium MayTheBestPetWin
【分析】 这道题是一道数学题,不过这个公式还是比较好推的。maxmax(∑i∈Sbi−∑i∈Tai\sum _{i\in S}{b_i}-\sum _{i\in T}a_{i},∑i∈Tbi−∑i∈Sai\sum _{i\in T}{b_i}-\sum _{i\in S}a_{i})=maxmax(∑i<=n−1i=0bi−∑i∈T(ai+bi)\sum _{i=0}^{i<=n-1}{b_i}-原创 2017-04-24 19:39:27 · 275 阅读 · 0 评论 -
SRM554 Div1Medium TheBrickTowerMediumDivOne
【分析】 这道题应该是一道yy题吧。 首先我们通过模拟,可以知道一个数最多对答案贡献2次,最少贡献0次。如果一个数很大,那我们只能将它放在最左边或最右边,那么这样他只能对答案贡献一次。 依据这个,我们可以设想,最终的序列可能是6 5 4 2 1 3 8 10这样的形式。 但是答案又有一个限制,字典序最小。 【代码】#include <bits/stdc++.h> using namespa原创 2017-04-24 19:02:21 · 293 阅读 · 0 评论 -
SRM588 Div1Medium KeyDungeonDiv1
【分析】 又是一道状压dp,不解释。 如果没有内存限制: 64 MB的话,这道题应该说起来是很水的。可惜没如果。 我们来一步一步的理清dp的状态:1、定义bool dp[i][j][k][z],表示已经去了i集合中的门,有j、k、z把红、绿、白钥匙,这种情况是否存在。转移其实是比较简单的,记忆化写起来很舒服。2、定义int dp[i][j][k],表示已经去了i集合中的门,有j、k把红、绿钥匙原创 2017-04-17 21:59:47 · 270 阅读 · 0 评论 -
SRM589 Div1Medium GearsDiv1
【分析】 一共才三种颜色,所以旋转的方向也就两种: 1、顺,顺,顺 2、顺,顺,逆 顺和逆当然可以交换。 同时,三个顺时针一定不优于两顺一逆。(因为这就要求剩下的齿轮都不能接触) 所以我们枚举是哪两种齿轮是顺时针。 这就符合二分图的定义了:同一种颜色一定不会咬合(没有边),不同种颜色会存在一些边。 而题目求的是最少要删多少个齿轮。在二分图中有边相连的两个齿轮至少要删掉一个。 所以原创 2017-04-21 20:23:48 · 238 阅读 · 0 评论 -
SRM553 Div1Medium TwoConvexShapes
【分析】 这道题不要看翻译!看原题! 题目看懂了,然后就蒙逼了。 应该比较容易知道这是一道计数dp。没错,万恶的计数dp!你不仅要知道他有多少种情况,怎样将他简单的实现,而且还要考虑哪些奇奇怪怪的重复情况! 总之,写这道题是崩溃的。直接贴代码。【代码】#include <bits/stdc++.h> #define mod 1000000007 using namespace std; #d原创 2017-05-03 19:05:27 · 286 阅读 · 0 评论 -
SRM552 Div1Medium FoxAndFlowerShopDivOne
【分析】 题目核心的意思就是找两个不相交的矩形并维护矩形中的信息。 然而朴素的暴力枚举当然是过不了的(n≤30) 因为做过求面积这类的问题,所以就想到了扫描线。 而且这个扫描线既要枚举垂直于x轴的,也要枚举垂直于y轴的。 但是单纯的扫描线并不能解决问题。我们要满足区域内百合花的数量与牵牛花的数量之差的绝对值不超过K的情况下再去寻找数量最大的。 我们将百合花定义为1,牵牛花定义为-1。原创 2017-05-03 18:58:46 · 336 阅读 · 0 评论 -
SRM579 Div1Medium TravellingPurchasingMan
【分析】 看了下范围,1≤p≤min(16,n)还是把这道题卖了。显然是状压dp嘛。 那我们就定义dp[i][j]表示此时在i这个店,已经在j这个集合买了物品,所需要花的最少的时间。 这个dp状态的转移不太好用我最喜欢的记忆化搜索。(不开心) 不过从i店到j店的最短距离还是需要Floyd跑一下的。(TC的范围那么小,不用Floyd真的很浪费啊!)【代码】#include <bits/stdc原创 2017-04-17 21:37:53 · 272 阅读 · 0 评论 -
SRM574 Div1Medium PolygonTraversal
【分析】 看到题目的范围时,我就在想这肯定是状压dp,肯定是定义dp[i][j]表示此时在i,取得点的集合为j。 那么问题就来了,有这些点,我怎么来判断从i是否能到j的补集的点呢?接下来我就在纸上画了图。 最后我发现,如果x想要到y,那么在圆上x顺时针到y或x逆时针到y一定都要有点。(至于为什么,我怎么知道,实践出真知)。 那么问题就解决了!【代码】#include <bits/stdc++原创 2017-04-17 21:16:30 · 257 阅读 · 0 评论 -
SRM573 Div1Medium Ski Resorts
【分析】 修改,我比较讨厌这个词。 有没有什么贪心的做法?不知道啊。 要改成什么? 问题好像走进了死胡同。我们唯一知道的就是这个点原来的特征值。枚举一下改成它们?试一试吧! 定义dis[i][j]为将i的特征值改成j的特征值。 接下来直接一遍Dijkstra带走!!! 其实我也知道这样说服不了你们。你其实可以模拟一下特征值为:10 20 10(i和i+1相连) 它的答案应该是10,无原创 2017-04-17 20:57:31 · 295 阅读 · 0 评论 -
SRM548 Div1Medium KingdomAndDice
dp不解释。 首先我们考虑答案的组成:对于a数组中非零的元素,它对答案(获胜的概率)的贡献是已经确定的。对于那些需要修改的元素,如果不考虑任何的优化,我们需要将枚举改成1~+oo,然后再for一遍b数组,算出它对答案的贡献,之后才会考虑dp转移的事情。 那我们先考虑第一个优化: 将b数组排序。 对于[b[i]+1,b[i+1]-1],a改成其中任意一个数字,对答案的贡献是相同的。 不过要记原创 2017-04-17 19:45:49 · 378 阅读 · 0 评论 -
SRM 531 SutTheBumbers
【分析】 一开始是直接想到用贪心的,因为样例是完全可以过的(要么全是横的,要么全是竖的)。不过在用大数据跑的时候就发现了问题。贪心不行,难道我们真的要模拟怎么分割这个矩形吗?不说复杂度,关键是不会模拟啊。最后将目光聚集到小方块上,一个方块的状态其实只有横着的或竖着的,也就是0、1序列。这就想到了状压。接下来就是模拟的事情了。【代码】 bool mk[6][6];class CutTh原创 2017-01-24 16:07:21 · 192 阅读 · 0 评论 -
SRM 514 MagicalGirlLevelThreeDivTwo
【分析】 这样的题目其实已经做过好几遍了。因为随便来一下,如果用string相加,那就真的没救了。题目虽然是叫我们求一段区间中有多少个‘1’,但是我们注意到R-L≤1000,所以我们可以单独求每一个点的情况。大体思路就是先把串的长度都预处理出来,再把一个段不断递归下去,直到到了题目中给过我们的已知串为止,然后直接return。不过要注意的一点是:串的长度到后来也会爆炸式增长,所以我原创 2017-01-24 16:08:27 · 256 阅读 · 0 评论 -
SRM567 Div1Medium StringGame
【分析】 这道题目比较奇怪,就是可以改变字母表的顺序(改变字典序),然后随意得排列所有的字符串,看看有哪些字符串的字典序能最小。 首先,如果字母表的顺序已经确定,字符串当然不是随便排。 搜索字母表的顺序当然是不可行的。 其实我们发现,对于解题唯一有用的就只有每个字符串的字母的个数。 我们可以先枚举哪个字符串赢,然后搜索当前先放哪种字母。放哪种字符唯一的限制就是不能有其他字符串的该字母的个数原创 2017-05-07 22:15:41 · 323 阅读 · 0 评论