代码改变世界

srm565 div1

2013-01-12 17:11 by macaroniz, 146 阅读, 0 推荐, 收藏,
摘要: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... 阅读全文

srm555 div1

2012-09-23 02:11 by macaroniz, 240 阅读, 0 推荐, 收藏,
摘要:255pt:构造出5^n的所有二进制串,然后dp即可。dp[i][j]表示考虑0~i构成的子串,分成j份是否可行,转移方程为dp[i][j] = dp[i][j] || (dp[i'][j-1] && (i'+1~i构成的子串是合法的)) 1 vector<string> arrPow; 2 bool dp[55][55]; 3 class CuttingBitString 4 { 5 public: 6 string s; 7 void getArrPow() 8 { 9 arrPow.clear();10 unsigned long long k 阅读全文

srm 545 div1

2012-06-09 03:25 by macaroniz, 229 阅读, 0 推荐, 收藏,
摘要: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, 229 阅读, 0 推荐, 收藏,
摘要: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 阅读, 0 推荐, 收藏,
摘要: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, 147 阅读, 0 推荐, 收藏,
摘要: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, 155 阅读, 0 推荐, 收藏,
摘要: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 阅读, 0 推荐, 收藏,
摘要: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, 158 阅读, 0 推荐, 收藏,
摘要: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 阅读, 0 推荐, 收藏,
摘要: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++) 阅读全文