摘要: 题目:问那个人可以走完所有的城市的最大承载量是多少分析:求最大生成树的边的最小值,可以用dijkstra算法变形做,相当于把求最小值改为求最大值,只需把dist初始化为0,并且min处改为max = -1,注意到可能为0,再改动其他地方就行,详细看代码。。。设图由邻接矩阵g存储。memset(dist,0x3f,sizeof(dist));memset(used,false,sizeof(used));dist[0]=0;//设0为源点for(i=0;i<n;i++)//循环n次{min=10000000;for(j=0;j<n;j++)//找到最小值if(!used[j]& 阅读全文
posted @ 2012-02-29 22:19 yejinru 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一个区间,长度<=1000 000;求其中素数相邻素数之间的差最小的和最大的;分析:双重筛法,其中区间的数可能较大,因此如果用试除法的话,显然不行的;用筛选法,首先第一次筛选出从1到47000之间的素数;第二次筛选时,利用第一次筛选出来的素数,判断L到U区间范围内的数是否是素数;因为范围是1<=L< U<=2,147,483,647,而U-L<=1000 000;所以我们可以设置一个1000000以内的数组,用res[i-L]的值为0或者1来表示是否是素数;核心算法是第二次的筛选,其中j=begin*prime[i]表示的是在A,B区间中prime[i] 阅读全文
posted @ 2012-02-29 22:19 yejinru 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 题目:求第几个只拥有素数因素为2,3,5的数,包括1在内分析:因为只要求求到第1500个,可以用打表的方法来做,把前1500个数全部求出来,因为每一个ugly数都可以用某个以前的数来进行因素分解,所以不停地搜索当2,3,5乘以某个数恰好大于当前最大的ugly,这个数即为最新的ugly数,具体请看代码:#include <iostream>using namespace std;#define X 1505int ugly[X];//记录前1500个ugly数int tot;void solve()//搜索函数{ int tot = 0;int p2 =1, p3 = 1,p5 =1 阅读全文
posted @ 2012-02-29 22:16 yejinru 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 题目:判断有没有两个电话号码能构成前缀关系分析:动态构树果然是Time limitted,只能是用静态构树或者直接安字典序排完序后比较相邻两个是否能构成前缀关系。。。下面简单说说动态构树吧(应该是对的。。)下面这个程序因为判了time limitted,应该是对的。。。#include <iostream>#include <cstdio>using namespace std;struct trie{ //定义字典树bool end;bool id;trie *p[10];//一共十位数字trie(){end = false;//判断此处到根处有没有单词,有返回tru 阅读全文
posted @ 2012-02-29 22:15 yejinru 阅读(232) 评论(0) 推荐(1) 编辑
摘要: 题目;如何只用两个容器装到c的水量分析:BFS题,只不过要记录路径,参考算法导论上的BFS算法(我是参考别人的程序的,又学到了新东西)。在这里简单总结一下:见代码中的文字#include <iostream>#include <queue>#include <cstring> using namespace std;#define X 105int a,b,c;bool use[X][X];///////此结构体为记录ab的水量以及总走过的次数typedef struct{int a; //a的水量int b; //b的水量int step;//总次数}No 阅读全文
posted @ 2012-02-29 22:15 yejinru 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题目:给出英文和密码文的互译,现在给出密码文求给出英文解析分析:还是可以用字典树来构造的(当然还可以用快排+二分法,哈希函数做),先给出trie树的构造吧#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 12#define MAXN 100005char ch[2*X],s1[MAXN][X],s2[X];int cnt;struct trie //定义字典树的结构体{bool haveend;//记录是否有单词在这结束的int id; // 阅读全文
posted @ 2012-02-29 22:14 yejinru 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 题目:问你最短能构成前缀的且不包括已有的单词(当没有时为自己)的单词分析:用trie树做,动态构树,然后从根节点开始往下找,当找到之前是已经有单词或者该处的单词已经走过该节点,继续往下,直到这两个条件不成立为止#include <iostream>#include <cstring>#include <cstdio>using namespace std;struct trie{ //trie树bool haveword;//标记是否已有树int num; //表示到目前为止单词走过该节点的单词数trie *p[26];trie(){haveword = f 阅读全文
posted @ 2012-02-29 22:13 yejinru 阅读(143) 评论(0) 推荐(0) 编辑
摘要: /*原来动态构树是这么费时间的。。。20000个单词最长为20个的题,跑到了1688MS,题目:题目大概是说找出相同的字符串并且统计个数。分析:因为昨天刚学完trie树,现在练了几道,有点感觉了,其实本题应该是可以用快排直接安字典序进行排序,然后按前后关系来进行判断有多少个的,下面继续讲讲trie树动态构树法吧:看程序解析*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 20005int d[X],cnt,print[X];structt 阅读全文
posted @ 2012-02-29 22:13 yejinru 阅读(202) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 1000005char s[X],p[X];int Next[X],len1,len2;void shift() //计算移动的模板{int i,j = -1;Next[0] = -1;for(i=1;i<len2;i++){while(j!=-1&&s[j+1]!=s[i])j = Next[j];if(s[j+1]==s[i])j++;Next[i] = j;}}in 阅读全文
posted @ 2012-02-29 22:12 yejinru 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 题目:求最大公共子序列(LCS)分析:用dp做,郁闷,还真有空格出现了,之前用scanf读入WA,改用gets读入A了状态转移方程式为dp[i][j] = dp[i-1][j-1]+1, s1[i]==s2[j]= max{dp[i-1][j],dp[i][j-1]} s1[i]!=s2[j]#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 1005char s[X],ch[X];int dp[X][X];int main(){freopen 阅读全文
posted @ 2012-02-29 22:12 yejinru 阅读(107) 评论(0) 推荐(0) 编辑