上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页
摘要: 简单dp题。这样的,意思为给你n个数,要你现在将这n个数分为m组,使得所有组内最大值与最小值的差的和最小。其实可以这样来考虑这个问题,首先可以把所有的数字从小到大排个序,显然如果有一种取法是最优的,那么所有的组里面的数一定是从小到大排序后中间的一段。那么这样就可以dp了,f[i][j]表示前i个数分为j组,最小需要花费的代价,这样对于i+1,我们只要直接枚举最后一位数的切断的位置即可。时间复杂度:O(N^3)#include #include #include #include #define maxn 105using namespace std;int n,m,a[maxn],f[maxn 阅读全文
posted @ 2013-12-01 17:50 092000 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 又是数学题。每次放入一个球所得到的的分数为x1+x2(x1表示左边的球中颜色的种数,x2表示右边)其实如果一个球的数量超过了2,那么剩下的就是一个乘法了。 这个理解很简单,因为超过了2的话,说明最优的方案一定是左右各一个,不然如果都在一边的话就只得1分了。所以我们预处理出所有不超过2的情况的得分(手算吧),然后剩余的就做一个乘法就可以了。略水,开始没有保证三个数的顺序,手滑。。。。。T_T#include #include #include #include typedef long long ll;using namespace std;ll a[3][3][3];ll f[4],n,k,t 阅读全文
posted @ 2013-11-30 21:49 092000 阅读(552) 评论(0) 推荐(0) 编辑
摘要: 题目很简单。给你n个数,输出n个答案,第i个答案表示从n个数里取遍i个数的异或值的和。其实每一个数最多也就32位,把所有的数分解,保存每一位总共有多少个1,最后要是这一位的异或结果为1,那么在所有的异或数中,这一位为1的数必须是有奇数个,在求解的时候就是求组合数的情况就可以了。直接水过。#include #include #include #define M 1000003#define maxn 1005typedef long long ll;using namespace std;int a[53];int ans,n,m,k,c[maxn][maxn],u[53];ll tep;voi 阅读全文
posted @ 2013-11-30 21:45 092000 阅读(987) 评论(0) 推荐(0) 编辑
摘要: 题目很有意思,我想说其实我在比赛的时候就看过了一下这个题目,今天才这么快搞出来吧。其实总共按上键的次数不会超过10个,我们可以每次假设相隔按两次上键之间按了xi次下键,由于上键的次数是确定的,所以最后就是求下键的次数和最小。同时用一个等式表达出来后我们就可以发现其实是一个sigama(xi*(n/i))=y-x+1-eps(eps是为了防止后面的数字恰等于1),求sigama(xi)的和最小。显然,这里很简单了,由于系数是从大到小的,我们可以直接从大的开始填充,直到填充的剩余那个数在1的范围以内就可以了。注意这里一定要考虑精度问题。。。居然一开始用cin给T掉了,我看只有两个数输入啊,神坑啊。 阅读全文
posted @ 2013-11-30 21:41 092000 阅读(3080) 评论(0) 推荐(0) 编辑
摘要: 水题。#include #include #include using namespace std;double totsum,totnum,k;char s[5];int n;double get(){ if (s[0]=='A') { if (s[1]==0) return 4; else return 3.7; } if (s[0]=='B') { if (s[1]==0) return 3; else if (s[1]=='+') return 3.3; else return 2.7;... 阅读全文
posted @ 2013-11-30 21:35 092000 阅读(424) 评论(0) 推荐(0) 编辑
摘要: 通过一个题目,学到了很多。题意为给你n个数,每次询问i,j,答案为i,j间任取两数所有的取法gcd的和。假设我们当前要看看这个区间有多少个数的gcd为x,最最原始的想法都是查询这个区间有多少个数为x的倍数。然后任取两个%&*¥#@!,但是有的gcd不是x,而是x的倍数。这个问题这样来考虑,其实思想上是莫比乌斯反演。假设当前我们有x个数是要求的现在的数y的倍数,那么所有的y的约数也肯定包含了这x个数。所以我们可以当前要乘以的这个数不是x,而是一个f[x],显然x的所有的约数的函数和为x,这样就保证了求解的正确性。同时想到了这里就会发现,所求的函数值与原题给的数据和各个数字的位置关系是没有 阅读全文
posted @ 2013-11-30 20:42 092000 阅读(406) 评论(0) 推荐(0) 编辑
摘要: 这个题目是这样的。给你三个字符串A,B,C,(C一定是A和B的一个公共子序列)。现在要求你构造出一个串D,使得D同时为A和B的子序列,且C是D的一个连续子串。求D的最大可能长度。很简单的一个DP题。其实这个题目有三个预处理就可以搞定了。1、f1[i][j]:A的前i个字符,B的前J个字符的最长公共子序列。2、f2[i][j]:A的i个字符以后,B的第J个字符以后的字符的最长公共子序列。3、A和B串以某个位置开始作为C的子序列时,最近的匹配距离(最近匹配完的那个地方)。有了这三个预处理,剩下的只要直接暴力枚举A和B中匹配的开始位置即可。#include #include #include #de 阅读全文
posted @ 2013-11-29 19:25 092000 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 很有意思,很好的题目。这样的,一个n*m的扫雷地图,告诉你哪些地方是有雷的。一个人如果点在了空白处,那么与其相邻的(八个方向)的数字以及空白都会递归地显示出来,如果点在数字上面,那么就只会显示这一个数字。游戏过程中,谁第一个无法点开一个非雷的格子算输。这、、、、其实可以看成是nim博弈问题,但是有一点点点点的不同。我们由于题目说明了数字的部分不会有重复的,所以我们把一个由空白部分连成的区域看成是一堆石子,那么有的单独的数字就是一堆石子且只有一颗。同时我们把所有的空白区域看成是一个石子,这样问题就转化为了给你N堆石子,以及每一堆的石子的数量,现在要你求出博弈的结果是先手胜还是后手胜?由于每次可选 阅读全文
posted @ 2013-11-29 19:19 092000 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 很有意思的一个数论题。是这样的,给你一个数数组a[i],其中给出的每一个数字和要求的数字方位都是[1,m],现在问你根据a[]构造一个b[],且a和b中间的不相等的元素的个数恰好有k个。现在问你gcd(b[])分别为1,2,……,m的个数分别有多少种可能情况。额。。。是这样来考虑的。——————容斥原理。有点像素数筛选,但是复杂一点。对于个数我们需要从大到小来求解(这里的缘由自己想象就知道了)假设当前我需要求解有多少个情况满足gcd(b[])=x,那么显然b中的所有的数都必须是x的倍数。首先我们可以直接统计出来在a中有多少个数不是x的倍数,那么显然这些数是一定要被更改掉的。如果非x倍数个数大于 阅读全文
posted @ 2013-11-28 00:12 092000 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 题目的意思是给你一些数字a[i](首位相连),现在要你选出一些连续的数字连续的每一位单独地作为一个数位。现在问你有多少种选择的方式使得选出的数字为k的一个倍数。其实题目是很简单的。由于k不大(200),总共的数字个数为50000,所以我们对于当前走到的每一个数字最多的状态数目也只有50000*200个。同时由于是循环的,我们可以使长度增倍,这样就可以保证序列是循环的了。不过注意,增倍后空间是开不下的,所以需要使用循环的滚动数组。同时注意递推的细节,还有有的a[i]不止一位数,不能直接取模。#include #include #include #define maxn 50050typedef 阅读全文
posted @ 2013-11-28 00:05 092000 阅读(305) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页