摘要: 题目很新颖的,略带智商,很好。题目的意思是给你一些白色边和黑色边,现在问你能否用两色边构造出一颗生成树,且树中白色边的数量为一个Fibonacci数。其实在没做题目之前我就已经听说了这个题目的解题方法了。所以。。。。。是这样做的,我们首先判断把所有的边都加进去,看看这个图是不是连通的,如果不是,那么显然我们可以直接输出NO了。接下来是一个很有趣的方法。我们首先把所有两端点在不同集合的白边加入到同一集合,看看最多能加多少条,再按照同样的方法把黑边加入同一集合,看看能加入多少条。这样一来我们等于是把树中能够包含的白色边的最大数和最小数都求出来了,接下来我们只要看看在这个区间中间有木有一个Fibon 阅读全文
posted @ 2013-11-16 17:17 092000 阅读(1183) 评论(0) 推荐(0) 编辑
摘要: 这个题目很有意思,一不小心就会让人坑在里面。题意是这样的,给你n,k,l。分别表示总共的长度,长度为5和10的车的不同颜色数量现在问你要把n的填满有多少种方案。很多人一开始都会脑子一根筋地想用排列组合去搞这个题目。然而实际上不是这样的。因为排列组合计算量巨大,而且这个题目的数据范围是10^15,绝对无法承受。其实我们可以先把n/5,这样相当于是放长度为1和长度为2的方案了。我们加入一个状态量f[i],其意义为长度为i的排列方案有多少种?那么我们可以迅速地得出这个状态转移的递推式:f[i]=k*f[i-1]+l*f[i-2]。(分别表示放长度为1和2的情况嘛)这样你是否有些眼熟了。。。。 对没有 阅读全文
posted @ 2013-11-15 21:22 092000 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 题意很简单,给你一个n*m的矩阵,现在问你这个矩阵能否变为标准矩阵(即数字从小到大),如果能最少需要几步呢?其实是个赤果果的水题。记得暑假安叔也出过一个类似的题目,那个好像是在codeforces上面吧。以前我不太理解为什么是这样子做的,现在完全理解了。对于给定的矩阵,我们可以先不顾其他的,先把任意一列和任意一行放在规定的位置,然后对其他的数进行判断,如果存在不在规定位置的数字,那么这个矩阵就是不合法的;否则这个举证就是合法的。为什么这么做是对的呢?? 其实我们可以这样来理解。假设当前我们已经任意放好了一列和一行,但是还有其他的位置的数字不能对应相等,那么为了使另外的位置的数字对应相等,我们必 阅读全文
posted @ 2013-11-15 21:16 092000 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 这个题目又是一个典型的dp斜率优化的题目。题意是给你n个数,你需要做的是把这个n个数分为连续的若干段,每段的权值为这段数字的和的平方加上M。求最小的总权值。我们可以根据题意写出朴素版的dp状态转移方程。然后就可以推导出使用优先队列来维护最优值。总共包括对首和队尾的两个操作。很简单,很朴素的题目,直接上代码吧。。。。就是范围定义小了,然后Wa了n^n^n^n^……发。 深坑啊。。。#include #include #include #define maxn 500500#define ll long longusing namespace std;ll f[maxn],a[maxn],sum[ 阅读全文
posted @ 2013-11-15 17:30 092000 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 题目是一个很典型的斜率优化的题目。题意就不说了。是这样的,对于双端优先队列,我们共有队首和队尾两个删除操作,来保证对于任意一个i,第一个元素都是最优的。我们把dp的转移方程列出来就直达其状态为f[i]=min(f[j]+(a[i]-a[j+1])^2+m)。所以我们如果有j1=f[j2]-f[j1]+a[j2+1]-a[j1+1]。同时由于等式两边都是正数而且随着i的增大,a[i]也是变大的,所以只要等式一旦成立,那么对于后面的每一个a[i],都是成立的,所以此时说明j1这个元素已经没有用了,因为它一定不会是后面的最优解。所以可以从对首删除,这样我们就完成了对首的操作。接下来稍微难一点的是队尾 阅读全文
posted @ 2013-11-15 17:25 092000 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 这是隐藏的最深的一个水题。其隐藏性能如此之好,是因为题目的描述十分蛋疼,写了好多好多的废话。让我们这种过不了六级的孩子情何以堪啊。是这样的,给你若干个矩形,每次在所有的矩形中两两组合形成许多许多新的矩形,同时宽和高也是任意组合的。(但是组合永远只是一个宽和一个高相组合)对于每做一次操作,你还可以改变操作后矩形的宽和高一个单位(变小或者变大)问你变出一个正方形的最小步数是多少?其实很简单,直接判断初始状态是否为正方形以及第一步可不可以变出正方形。剩下的情况直接返回(sum+1)/2。自己理解一下就可以了,太简单,我就不说了。#include #include #include #define m 阅读全文
posted @ 2013-11-13 23:43 092000 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 题目绝对够水,我就不详细说明了。直接上代码吧。只是提示一下要用 unsigned long long。(不知道我不用字典树为什么会超时,肿么搞的)#include #include #include #define maxn 2300#define ll unsigned long longusing namespace std;ll tag[50050],next[50050][60],N;char s[maxn];ll g[maxn],dis,tot,now;ll b,v,k,n;ll f[maxn];ll getcode(char cc){ if (cc>='a' 阅读全文
posted @ 2013-11-13 23:37 092000 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 题目是这样的,游戏规则,每个人轮流将二维空间上的皇后往下,往左或者往斜下45度的方向移动。谁第一个移动到0,0的位置就获胜。题目给定你若干个矩形,求矩形中任取一点且该点必胜的概率有概率。其实是这样的,我们需要把所有的必败点的坐标都求出来。发现在10^6以内的必败点的数量只有70多万个,这样我们可以全部存下来。其实必败点是这样求得,第一个点为(0,0),接下来第i个点的坐标为(x,y),其中x为第一个没有在前面的坐标中间出现过的数字,y=x+i。这样就把所有的必败的点都求出来了呢,同时由于对称性,我们要把另外一边的点也全部求出来。这样相当于是存到了两个数组里面。接下来的就是询问了。对于每个矩形, 阅读全文
posted @ 2013-11-13 23:33 092000 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 题意很简单,本身也是个水题。给你两个字符串,如果两个串完全相同,那么输出yes;如果两串只是空格的不同,出去空格后完全相同,那么输出Output Format Error,否则输出Wrong Answer。很简单,在两个数组上面各设置一个指针逐个比对向后移动,同时设置两个flag分别标记有无不相同的字符或者空格就ok了。#include #include #include #define maxn 1000100using namespace std;char s1[maxn],s2[maxn];int n,m,t,x1,x2,T;bool flag1,flag2;void compare() 阅读全文
posted @ 2013-11-13 23:24 092000 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 题目要求你在n个数的序列中,找出一段连续的长度不小于k的连续的序列,使得这个序列的平均数最大。输出这个平均数。典型的优先队列。首先我们需要根据输入的序列,制造一个和序列。然后从k开始往后面走,其实每走一步都维护了一下优先队列,然后加入当前的这个数。很简单吧应该。。。。。。 1 #include 2 #include 3 #include 4 #define maxn 100100 5 using namespace std; 6 7 int a[maxn],tep,n,k,tot,sum[maxn]; 8 int head,tail,j; 9 int q[maxn];10 double... 阅读全文
posted @ 2013-11-13 10:24 092000 阅读(417) 评论(0) 推荐(0) 编辑