上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 34 下一页
摘要: 题意:如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。分析:要使卡上的余额最少,相当于用有限的金额去买最多的菜。而题目多了一个限制条件,就是“卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)”,也是就是说,当卡上的金额大于等于5时,可以用5元去买任意价格的菜,所以当然是用这5元去买最贵的菜了,剩下的问题就是,求剩下的m-5 阅读全文
posted @ 2011-11-25 14:07 枕边梦 阅读(322) 评论(0) 推荐(0) 编辑
摘要: hdu3033 题目要求与普通的组合背包(每组至多选一个)有所区别,而本题目的话,每组至少选一个,那么如何保证每组至少选一个呢,问题就在初始化的问题还有状态转移的问题了if(f[i][l-br[i].b[j]]!=-1 && f[i][l]<f[i][l-br[i].b[j]]+br[i].c[j])//从当前组再多选一个 f[i][l]=f[i][l-br[i].b[j]]+br[i].c[j];if(f[i-1][l-br[i].b[j]]!=-1 && f[i][l]<f[i-1][l-br[i].b[j]]+br[i].c[j]) //在上一 阅读全文
posted @ 2011-11-24 14:56 枕边梦 阅读(461) 评论(0) 推荐(0) 编辑
摘要: 描述在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣。如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素。元素不一定要全部出现(如BBC就没有出现)。举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素:{A, AB, BA, CA, BBC}序列 S 的前面 K 个字符称作 S 中长度为 K 的前缀。设计一个程序,输入一个元素集合以及一个大写字母序列 S ,设S'是序列S的最长前缀, 阅读全文
posted @ 2011-11-16 10:58 枕边梦 阅读(563) 评论(0) 推荐(0) 编辑
摘要: 题意:用N个点组成一棵深度为K的二叉树,求一共有几种方法?分析:哎,感觉自己好水呀,借鉴了USACO上面的题解才过的,自己想了好久都没什么思路设dp[i,j]表示用i个点组成深度最多为j的二叉树的方法数,(注意,这里i必定是奇数),则:dp[i,j]=∑(dp[k,j-1]×dp[i-1-k,j-1])(k∈{1..i-2})边界条件:dp[1,i]=1我们要求的是深度恰好为K的方法数S,易知S=dp[n,k]-dp[n,k-1]。但需要注意的是,如果每次都取模,最后可能会有dp[n,k]<dp[n,k-1],所以可以用S=(dp[n,k]-dp[n,k-1]+v) mod v 阅读全文
posted @ 2011-11-15 00:45 枕边梦 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 题意:考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不要在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。分析:DFS枚举就好了关键就是 处理‘ ’,用last保存最近的一个连续的整数,不将该数进行运算,sum表示last之前的运算结果若当前选择了 ' ':sum=sum-last+last*10+s+1(last>0);sum=sum 阅读全文
posted @ 2011-11-13 16:28 枕边梦 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,还是比较基本的母函数/* ID: nanke691 LANG: C++ TASK: money */ #include<iostream>#include<string>#include<fstream>#include<string.h>#include<algorithm>using namespace std;const int maxn = 10000;int p[30],V,n;long long num1[maxn+1],num[maxn+1];void sovle(){ memset(num,0,sizeof(nu 阅读全文
posted @ 2011-11-13 10:57 枕边梦 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 1.题意解释:意思是有n种彩票,你要想集齐这所有的n种,需要买多少张彩票2.如果有n种,那么我们要求的结果就是n/n + n/n-1 + n/n-2 +...+ n/2 + n/1 ,即n*(1/n + 1/n-1 +...+ 1/2 +1/1) 原理: 我们要集齐n种不同的彩票, 买第一张任意,概率为n/n,买第二张就需要和第一张不同,即剩下的n-1种里哪种都可以,成功的概率是n-1/n...如果我们已经集齐了n-1种,再买彩票我们希望买到最后一种,由于是均匀分布的,所以买到最后一种彩票的概率是1/n.那么从期望的角度来说我们需要买n张,才能买到(当然我们就算买n张也不一定就能买到,也可能买 阅读全文
posted @ 2011-11-13 10:22 枕边梦 阅读(690) 评论(0) 推荐(0) 编辑
摘要: 题意已经很清楚了,主要就是找递推式:sum[i]=sum[i-1]+2*sum[i-2];需要用到大数,不过这种普通的大数加法已经很熟了#include<iostream>#include<algorithm>using namespace std;int sum[1010][100],len[1010];void init(){ sum[0][0]=0;len[0]=0; sum[1][0]=0;len[1]=0; sum[2][0]=1;len[2]=0; for(int i=3;i<=1000;i++) { int k,j; k=0; for(j=0;j&l 阅读全文
posted @ 2011-11-13 02:12 枕边梦 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 感觉,目前主要是能够将具体的题目转化为某一种博弈类型,这样根据类型来做,会好很多。首先,是比较基础的巴什博奕(Bash Game):根据这三个性质去推理的话,下面这几道题目应该可以很快解决(1) 所有终结点是必败点(P点); (2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点); (3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点). hdu1846#include<iostream>using namespace std;int main(){ int n,m,cas; scanf("%d",&cas); while(cas 阅读全文
posted @ 2011-11-11 01:22 枕边梦 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 题意:求多个串的最长公共子串pku3450用KMP算法#include<iostream>#include<algorithm>#include<string.h>using namespace std;int nxt[210];char str[4010][210],s[210];int n,m;bool KMP(char *T,char *P){ memset(nxt,0,sizeof(nxt)); nxt[0]=-1; int k=-1; for(int q=1;q<m;q++) { while(k>-1&& P[k+1]! 阅读全文
posted @ 2011-11-09 18:16 枕边梦 阅读(178) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 34 下一页