上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 66 下一页
摘要: 不管你是怎么做的,反正我是用二分做的,相当于做了一个预处理。一个最优的序列一定是 1 2 3 .. N .. 3 2 1,或者是 1 2 3 .. N N .. 3 2 1.代码如下:#include <cstdlib>#include <cstdio>using namespace std;long long rec[131100], a, b;void pre(){ rec[1] = 1; long long LIM = 1LL << 32, base = 1; int i; for (i = 2; rec[i-1] <= LIM; ++i) { 阅读全文
posted @ 2012-08-19 22:56 沐阳 阅读(265) 评论(0) 推荐(0)
摘要: 这题如果是要输出所有的解的情况的话,用两个有序表查找可以优化到O(n^3),幸好这题只是要求出一种方案,那么我们就有以下结论:当 N < 8 的时候是无解的当 N > 8 并且 N是一个奇数的话,那么就可以拆成 2 + 5 + 一个偶数,根据哥德巴赫猜想,一个合数一定能够分解成两个素数之和,所以只要遍历一遍素数表即可当 N > 8 并且 N是一个偶数的话,那么就可以拆成 2 + 2 + 一个偶数,同理可以在 O (n / ln(n))的时间内完成。代码如下:#include <cstdlib>#include <cstdio>#include < 阅读全文
posted @ 2012-08-19 22:50 沐阳 阅读(324) 评论(0) 推荐(0)
摘要: 这题就是考察了一个单调队列,做的时候要注意由于首尾相连,所以我们就扩出一倍的空间来简化这个过程。定义f[j]表示在第j号位置结束的连续长度不超过k的最大和,那么f[j] = MAX( sum[j] - sum[k] ),其中就要求满足区间要求,由于每个点都是从前面的sum[k]得来的,所以就可以用一个单调队列来进行同步更新。详见代码:#include <cstdlib>#include <cstring>#include <cstdio>#define INF 0x3fffffff#define MAXN 100005using namespace std; 阅读全文
posted @ 2012-08-18 23:40 沐阳 阅读(633) 评论(0) 推荐(0)
摘要: 这题是给定了一个长度为N的串,问一个固定区域内的最小值和最大值,这题没办法通过DP来求解,因为单纯保留最值的信息是行不通。详见代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 1000005using namespace std;int N, M, seq[MAXN], que[MAXN], front, tail;/* 此题就是要求出给定序列的某一段区间内的最小值和最大值 一个长为N的序列,每次选取M长的区间进行滑动 阅读全文
posted @ 2012-08-18 13:20 沐阳 阅读(225) 评论(0) 推荐(0)
摘要: 这题如果采用普通的DP方程的话果断TLE。所以需要对DP方程进行优化。由于这里龙珠可以随意选取,所以龙珠的编号也就没有了什么意义了,所以直接先对龙珠进行排序,我们只要保证其位置和花费同步排序就可以了。接下来就是优化了,这个部分可以见代码,在上一题中使用的同步滑动指针,这里则不然,需要根据数值来异步滑动指针。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#define INF 0x7f7f7f7fusing namespace std;in 阅读全文
posted @ 2012-08-18 02:06 沐阳 阅读(260) 评论(0) 推荐(0)
摘要: Description韩父有N个儿子,分别是韩一,韩二…韩N。由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万。舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火火,嫉妒心遂起,便发微薄调侃韩二们站成一列时身高参差不齐。由于舟子的影响力,随口一句便会造成韩家的巨大损失,具体亏损是这样计算的,韩一,韩二…韩N站成一排,损失即为C*(韩i与韩i+1的高度差(1<=i<N))之和,搞不好连女儿都赔了.韩父苦苦思索,决定给韩子们内增高(注意韩子们变矮是不科学的只能增高或什么也不做),增高1cm是很容易的,可是增高10cm花费就很大 阅读全文
posted @ 2012-08-17 21:28 沐阳 阅读(777) 评论(0) 推荐(0)
摘要: 通过枚举每个点作为最小值,再通过动态规划求出以每个点作为最小值的左右区间。代码如下:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>#define MAXN 100005using namespace std;typedef long long int Int64;Int64 seq[MAXN], sum[MAXN], ret;int L[MAXN], R[MAXN], N;int main(){ while (scanf("%d" 阅读全文
posted @ 2012-08-17 10:35 沐阳 阅读(305) 评论(0) 推荐(0)
摘要: 这题好像是POJ的一道原题... 首先这题我们能够确定如果一条线段被另外一条线段所包含的话,那么那条包含它的线段的左端点一定小于或者等于这个线段。于是我们按照左端点从小到大排序,左端点相同按照右端点从大到小排序,这样就能够保证所有包含第i条线段的线段一定在前面得到了更新。接着我们就直接要求前面线段的右区间大于改线段,由于用的树状数组,所以用一个数减去这个右端点,所以该右端点就越靠近左边,所以也就能使上树状数组了,需要注意的当两条线段的属性完全一样时,我们要直接把前面的答案赋值给后面的线段,然后再去更新。代码如下:#include <cstring>#include <cstd 阅读全文
posted @ 2012-08-17 01:47 沐阳 阅读(298) 评论(0) 推荐(0)
摘要: 这题一开始想用状态压缩DP解,后来发现状态开不下...还是没有很好的理解啊。这里将棋盘看做是两个正方形,由于只能够走对角线,所以两个正方形可以看做是无关的,因此我们只要求出每个正方形走相应步数的方案。对于k不而言,在两个正方形里面就有(1, k-1), (2, k-2)...例如这样的分法,必须保证所有的分法都是合法的。现在问题就在于如何去求一个N*N的矩阵能放置一些棋子,这些棋子要求上下左右不能够在同行同列的方案数。其实就是一个简单的递推而已,我们定义dp[i][j]表示到第i行放置j个方案数,那么dp[i][j] = dp[i-1][j] + dp[i-1][j-1]*(n-j+1),其实 阅读全文
posted @ 2012-08-17 01:39 沐阳 阅读(308) 评论(0) 推荐(0)
摘要: 首先说明这题不是在线算法,也不能说是离线算法,就是一个预处理能够把所有的结果全部算出来再O(1)的时间得到答案。首先我们要将一这种上下属的关系通过一个dfs转化为一维的关系,相同属性(指为同一个人的下属)的话,那么在物理上就是连续的。这样处理后,我们考虑一个员工能够被替代的话,那么替代他的人的能力值就一定是比他高的,因此我们按照能力值对所有的人进行一次排序,能力值相同的就按照标号从小到大排,这样的话,就能够保证每次询问一个点时,线段树中的所有值都是满足上下属关系的。排好序后,再从左到右扫描一遍,每次先查询如果解雇这个员工,谁将成为他的最佳替代者。代码如下:#include <cstdli 阅读全文
posted @ 2012-08-15 22:31 沐阳 阅读(743) 评论(0) 推荐(0)
上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 66 下一页