摘要:
250pt很简单的dp,没有什么好说的。#define N 51#define MAXPRICE 102class MonstersValley{public: long long dp[N][MAXPRICE]; long long maxx(long long a,long long b) { if(a < b) return b; return a; } int minimumPrice(vector<long long> dread, vector <int> price) { int n = dread.s... 阅读全文
随笔分类 - 算法与数据结构
srm 545 div1
2012-06-09 03:25 by macaroniz, 230 阅读, 收藏,
摘要:
250pt从最高位(左边)开始考虑,从小到大枚举当前位可能的数字,判断是否有可能构造出结果,如果有可能就把当前数字固定下来,考虑下一位数字。整体思想类似按位dp。using namespace std;class StrIIRec{public: string ans,minStr; int hash[30]; int n; int maybe(char ch) { string str = ans + ch; for(int i = n-1;i >= 0;i--) if(hash[i] == 0 && i != ... 阅读全文
srm 543 div1
2012-05-21 00:25 by macaroniz, 231 阅读, 收藏,
摘要:
250pt最开始想一位一位的单独求,但是发现计算每一位的0和1很复杂,需要按位dp。于是想别的方法,注意到如果记SXOR(x)表示0到x的异或和,那么原问题可以转化为SXOR(R)^SXOR(L-1)。如何快速的求出SXOR(X)呢?方法有很多,我使用的是按位求。注意到一个重要的性质:SXOR(2^n-1) = 0,n >= 2。设X的二进制表示最高位为2^t,因此SXOR(X) =((X - 2^t + 1) % 2 ? 2^t : 0) + SXOR(X - 2^t)需要对x = 0,1,2,3特判一下就可以了。class EllysXors{public: long long ca 阅读全文
srm 524 div1
2012-05-18 03:10 by macaroniz, 239 阅读, 收藏,
摘要:
250pt很水的题不写了500pt有这几个重要的观察:1、如果存在长度为len的序列,那么必定存在长度为len-1的序列,这一点让我们可以将求解过程转化为二分答案+判定的过程。2、如果将子段和表示成Sum差(sum[i]-sum[j],sum表示a[0]~a[i]的元素和)的形式,实际上就是一个判断是否存在自环的问题。3、答案不超过1000^2,实际上官方题解上给出了一个更优的下界——答案不超过minx{|C[i]| + |C[j]| - 1},其中要求C[i]与C[j]符号不同,这个结果实际上是构造得到的: 不妨设C[i] > 0,C[j]<0,且|C[i]| > |C[j 阅读全文
srm334 div1
2012-05-02 14:26 by macaroniz, 149 阅读, 收藏,
摘要:
250pt思路很明显,枚举所有的合法序列然后代入检验。可以降低复杂度的地方在于如何快速求和,我的方法是直接预处理出来求和之后每个字母的系数是多少就可以了。时间复杂度是O(10!*10)class EncodedSum{public: long long ai[15]; long long apow[15]; long long maximumSum(vector <string> numbers) { apow[0] = 1; for(int i = 1;i < 15;i++) apow[i] = apow[i-1] * 10; ... 阅读全文
srm539 div1
2012-04-30 11:13 by macaroniz, 156 阅读, 收藏,
摘要:
250pt可以很容易想到,如果在确定用哪些box之后,我们可以直接算出该情况下x的范围 sum{low[i]} <= x <= sum{upper[i]}。因此,只需要枚举一下所有选择box的方案,就可以求出这么一系列的x的范围。但是由于这些范围可能存在区间重叠,因此我们需要按照(low,upper)排序后合并区间,因此我们只需要维护一个nowlow和nowUpper即可。总的复杂度为O(15*2^15+2^15)class Over9000Rocks{public: struct st { int low,upper; }; vector<st> arr... 阅读全文
srm540 div1
2012-04-13 02:43 by macaroniz, 138 阅读, 收藏,
摘要:
250pt很简单,让a1作为方程的自由元,然后判断即可,但是细节很多,很考察代码能力。写的有点丑,不想改了。class ImportantSequence{public: long long maxx(long long a,long long b) { return a > b ? a : b; } long long minx(long long a,long long b) { return a < b ? a : b; } long long maxx2(long long a,long long b) { ... 阅读全文
srm538 div1
2012-04-06 02:25 by macaroniz, 163 阅读, 收藏,
摘要:
250pt 水题不写了。500pt由于顺序可以随便调整,因此肯定会把向前的合并在一起,向后的合并在一起,然后按照所有可行的角度进行旋转,找出最远距离即可(最接近 180°的就是答案的角度)。求出所有可行角度DP即可。在精度问题上卡了好久,mark一下。class TurtleSpy{public: vector<int> deg; int da,db; int getNum(string str,int pos) { int tmp = 0; for(int i = pos;i < str.length();i++) t... 阅读全文
srm537 div1
2012-04-03 03:33 by macaroniz, 150 阅读, 收藏,
摘要:
250pt给定A,B,X求pA+qB = tX+kY,p,q,t,k >= 0中Y的个数。首先考虑什么时候y有无穷多解,很显然此时k取0,因此X|A && X|B可以观察出在这个等式中,有两个基本解,既A = tX+kY与B = tX+kY,于是问题转化为,我们对于给定的X,求出同时满足这两个等式的Y的个数。显然,如果Y有有限个取值,那么Y <= MAX(A,B).bool can(int A,int B,int X,int Y){ bool flag1 = false,flag2 = false; for(int i = 0;i * X <= A;i++) 阅读全文
hdu3901 带通配符的匹配问题
2011-08-03 20:01 by macaroniz, 510 阅读, 收藏,
摘要:
这题真的非常考察对kmp算法的理解,特别记录一下。题意很简单,给一个只包含字母的文本T和一个包含字母和通配符*与?的模式p,判断T中是否包含p。解决带通配符的匹配问题有很多方法,比如编译原理中大家学过的DFN自动机,这里我们主要讨论使用KMP算法来解决这个问题。不妨先讨论通配符*。如何把通配符*加入到kmp的算法中呢?一个比较容易想到的方法是这样的:将模式p分成几个不包含*的子模式,并且分别在文本T中匹配,如果存在这么一个匹配结果,使得这些“一段段”的模式在文本中形成一些不相交的匹配,那么就意味着模式P是可以和文本T匹配的。比如文本:abxxxcd,模式:ab*cd,这里模式被分成了两个子模式 阅读全文
子树同构问题
2011-06-04 15:43 by macaroniz, 444 阅读, 收藏,
摘要:
大概描述就是在给定树a和树b,判定a是否与b中某棵子树同构。原出题人给的树大小为200。最开始的想法是用最小表示法来确定树a和树b的结构,然后再通过某种方法进行比较,不过发现由于a的标号与b不一定相同,因为这种想法很快就被否定掉了。不妨先假设树a的根已经确定,我们知道一棵树的根如果确定的话,那么这棵树的结构也就确定了。换了几个思路后,脑子里冒出了一个完全属于灵光一现的 想法,如果我知道a中某个节点构成的子树在b中所有同构的情况,那么我应该就可以推出a中该节点父亲和哪些节点是同构的。这样用一个简单的dp就可以搞 定。假设S[i]表示的是a中节点i构成的子树在b中同构的所有情况,数学一点的表达式就 阅读全文
浙公网安备 33010602011771号