06 2013 档案
摘要:题目链接有红绿蓝三种颜色的画,每种拿三朵可以组成一束花,或者各拿一朵组成花束,告诉你每种花的数目,求出可能组成最多的花束。如果你的代码过不了,考虑一下 8 8 9这种组合。 因为数据量很大,我的思想就是局部和总体采用不同的策略。#include #include using namespace std;int main(){ int r, g, b; while (cin >> r >> g >> b) { int m = min(r, g); m = min (m, b); int ans = 0; int a = 0...
阅读全文
摘要:题目链接题意: 有n个男孩和m个女孩,他们要结对跳舞,每对要有一个女孩和一个男孩,而且其中一个要求之前没有和其他人结对,求出最大可以结多少对。如图,一条线代表一对,只有这样三种情况。#include #include #include using namespace std;int main(){ int n, m; while (cin >> n >> m) { int mn = min(n, m); int k = (mn<<1) - 1; k += (max(n, m) - mn); int a = 1, b ...
阅读全文
摘要://hdoj 3555//2013-06-27-16.53#include #include __int64 dp[21][3], n;int len, bit[21];//dp[i][0] 长度为i 包含49的个数//dp[i][1] 长度为i没有49但以9开头的//dp[i][2] 长度为i 没有49void init(){ dp[0][2] = 1; for (int i = 1; i 4) ans += dp[i-1][1]; if (bit[i] == 9 && bit[i+1] == 4) ...
阅读全文
摘要:这题数据量相对比较小,可以暴力打表解决。不过我这里用数位dp 刚开始学数位dp,参考了别人的代码。//2013-06-27-15.30#include #include int dp[7][3];//dp[i][0] 表示不存在不吉利的数字//dp[i][1] 表示不存在不吉利的数字,且最高位是2//dp[i][2] 表示存在不吉利的数字int bit[10];void init(){ dp[0][0] = 1; for (int i = 1; i 4) //高位可能出现4的情况 ans += dp[i-1][0]; if (!flag &...
阅读全文
摘要:http://poj.org/problem?id=1664 这题可以用递归的方式做,想给第一个盘子里放上苹果从(0到m),然后给第二个放上,为了保证每次产生的放法是不同的,第二个里面放置的苹果不能从0开始,否则就会产生相同的放法,然后同理第三第四个盘子。。。。 还有一个问题,可能放到最后一个盘子了,还有很多苹果没有放,怎么办?? 都放最后一个里面?? 其实不是,这样的话可能和前面某种情况出发,所以在放置的过程中就要保证不能产生这种情况,(y/(n-x) >= i)这行代码就保证了,因为盘子里面的苹果数是非递减的,剩余i个盘子,只要剩余的苹果数除以剩余的盘子数不小于当前盘子的苹果数,就可
阅读全文
摘要:http://poj.org/problem?id=1050 我们已经知道求最大子段和的dp算法 参考 here 也可参考编程之美有关最大子矩阵和部分。 然后将这个扩大到二维就是这道题。顺便说一下,有时候不要把问题想复杂了,有些问题只能靠暴力求解,而这道题是暴力加算法。 在这个题中,我们可以把二维压缩到一维然后求解最大子段。我们先枚举所求矩阵的起点行和结束行,然后把每一列的数据之和求出,用这些数据和就构造出一个一维的数组(代码中我没有明确表示出这个数组),然后用最大子段和的dp算法求解。 关于二维压缩到一维的过程,适当处理可以大大减小时间复杂度。 最终时间复杂度是O(n^3);...
阅读全文
摘要:题目链接 大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的),然后求怎么安排能使好感度和最大,求出最大值。 开始试了纯暴力的方法,时间复杂度是n!果断超时#include #include #include using namespace std;int vis[17];int n, ans, sum;int map[19][19];void dfs(int x){ if (x == n+1) { ans = max(ans, ...
阅读全文
摘要:A. Perfect Pairtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputLet us call a pair of integer numbersm-perfect, if at least one number in the pair is greater than or equal tom. Thus, the pairs (3, 3) and (0, 2) are 2-perfect while the pair (-1, 1)
阅读全文
摘要:给你n个数,让你找出其中最大的K个数。解法1:很多人上来就对其进行排序,选用不同的排序方法有不同的时间复杂度,这里我们假设使用了最快的快排,时间复杂度为O(n*logn)。通过排序我摘出前K大的数。但也许快排不是最优的,我们只找最大的K个数,何必要对所有的数进行排序,我们只需要进行局部排序即可,时间复杂度大概是O(N*K)。但快排和局部排序谁优谁劣是并不是一定的,当K大于某个数值时快排的优势就显现出来了,大概是logn吧。解法2:这个方法是基于快排的,但不是完整的快排。回忆一下快排,在每一步中,都是将带排数据分成两部分,其中一部分中的任何一个都比另一部分中的任何都大,然后递归排序。在这里,我们
阅读全文
摘要:A.Even Odds 给你n和k, 把从1到n先排奇数后排偶数排成一个新的序列,输出第k个位置的数。比如 10 3 拍好后就是 1 3 5 7 9 2 4 6 8 10 第3个数是5。//cf 318 A//2013-06-18-20.30#include using namespace std;int main(){ __int64 n, k; while (cin >> n >> k) { if (k #include #include using namespace std;const int maxn = 1000006;char str[maxn]...
阅读全文
摘要:地址B. Sereja and Arraytime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputSereja has got an array, consisting ofnintegers,a1, a2, ..., an. Sereja is an active boy, so he is now going to completemoperations. Each operation will have one of the three for
阅读全文
摘要:虽然结果比我们预期的好一些,拿了银牌(本来感觉只能拿铜牌),但感觉还是很弱。 我们只A了三个最水的题目。 开始确实有些失策,晨晨看了第一题(给出等边三角形的两个点,计算第三个点),一道简单的计算几何,然后他就敲,40分钟还没搞定,我们没有考虑到我们有个计算几何的大牛成成博客,失策,他虽然敲代码的速度很慢,但效率极高,一上来就替我们A掉了第一题。感觉因为这个我们要浪费30多分钟。 然后晨晨很快又A掉一题,两个一A,我们的名次排在银牌的前列。 由于后来一直没出题rank一直掉,到封榜前掉到银牌的倒数第二。 后来我尝试做了C题,一看就是一道快速幂取模的题,成成替我写了快速幂...
阅读全文
摘要:题目链接题目大意是有一个含n个数的数组,你可以通过+1或者-1的操作使得其中的数是1--n中的数,且没有重复的数。既然是这样的题意,那么我就应该把原数组中的数尽量往他最接近1--n中的位置放,然后求差绝对值之和,但有多个数,怎么使他们和最小,这样就要对其进行排序了,直接按大小给它们安排好位置,然后计算。//CF 285C//2013-06-06-19.57#include #include #include using namespace std;const int maxn = 3*100001;int a[maxn];int main(){ int n; while (scan...
阅读全文
摘要:题目链接题目就是让你找出一个数组中可以将这个数组中所有数整除的数,很明显,如果存在,这个数肯定是最小的一个。//cf 299A//2013-06-05-20.51#include #include #include using namespace std;const int maxn = 100005;int a[maxn];int main(){ int n; while (scanf("%d", &n) != EOF) { int m = 0x3f3f3f3f; for (int i = 0; i < n; i++) { ...
阅读全文
摘要:题目链接就是给你两个日期,让你求两个日期之间差多少天。我先算出两个日期分别是公元多少天,然后相减得到结果。//cf 304B//2013-06-05-18.38#include #include int y, m, d;int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int loop(int y){ if (y%4 == 0 && y%100 != 0 || y%400 == 0) return 1; return 0;}int count(){ int sum = 0; fo...
阅读全文
摘要:题目链接给你一个n,计算出1 ≤ a ≤ b ≤ c ≤ n.使得由abc构成的三角形满足勾股定理,c为斜边。没有简单的方法,直接爆力,但是要注意,有些abc满足勾股定理的表达式,但不一定是三角形,所以要判断一下,根据三角形三边的性质,两边之和大于第三边,两边之差小于第三边。//cf304 A//2013-06-05-18.14#include #include int main(){ int n; while (scanf("%d", &n) != EOF) { int cnt = 0; for (int i = 1; i n) ...
阅读全文
摘要:题目链接 给出一个非减序的数组a[n], 然后得到s=2^a1+.……+2^an, 要使s为2^v -1,需要在数组中添加几个数。 我的思路是这样的,由2^a+2^a = 2^(a+1)可知,如果有两个连续的数a,我们可以把他们合并为a+1放入集合中,使集合中没有重复的数,我可以用stl里的set。如果想要满足题目中的要求,集合中必须有最大那个数个元素,缺多少就可以计算出来了。代码://codeforces 305 C. Ivan and Powers of Two//2013-06-05-17.19#include #include #include #include using n...
阅读全文
摘要:题目链接题目意思是在n*m的矩阵中,你可以对矩阵中的每个数加或者减d,求最少的操作次数,使得矩阵中所有的元素相同。虽然在condeforces中被分到了dp一类,但完全可以通过排序,暴力的方法解决。#include #include #include #include using namespace std;const int maxn = 10005;int a[maxn];int main(){ int n, m, d; while (scanf("%d %d %d", &n, &m, &d) != EOF) { int t = n*m; fo.
阅读全文
摘要:题目链接虽然不知道怎么做,但是AC还是没有问题的。大概就是循环n次,从m加到m-n/2 除了最后一个数,每个都加两次。#include int main(){ int n, m; while (scanf("%d %d", &m, &n) != EOF) { int ans = 0; int t = m; for (int i = n; i != 1; i -= 2) { ans += t*2; t--; } ans += t; pri...
阅读全文
摘要:1.资源问题1-----机器分配问题F[I,j] = max(f[i-1,k]+w[i,j-k])2.资源问题2------01背包问题F[I,j] = max(f[i-1,j-v]+w,f[i-1,j]); 3.线性动态规划1-----朴素最长非降子序列F = max{f[j]+1}4.剖分问题1-----石子合并F[i,j] = min(f[i,k]+f[k+1,j]+sum[i,j]);5.剖分问题2-----多边形剖分F[I,j] = min(f[i,k]+f[k,j]+a[k]*a[j]*a);6.剖分问题3------乘积最大f[i,j] = max(f[k,j-1]*mult[k
阅读全文

浙公网安备 33010602011771号