摘要: 分析: 贪心算法 当n为偶数时,例如:1 2 3 4 5 6,可知,分开的两支队伍为 1 3 5与2 4 6时等待时间最小。 当n为奇数时,例如1 2 3 4 5时,可知,分开的两支队伍为 1 3 4与2 4时总等待时间最小,若n为奇数时,所以每次总把最小的数放在最长的队列中时, 总等待时间最小#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define X 1005int d[X],n,ans;int main(){ freopen("sum 阅读全文
posted @ 2012-03-17 20:13 yejinru 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 分析: 扩展的欧几里德算法,ax+by=gcd(a,b),若gcd(a,b)!=1,输出-1,否则,用扩展的欧几里德算法求出 最小的x与y即可,注意到 当存在0时,若有1输出1,否则输出-1; 当存在1,若有2输出1,否则输出2(因为直接a-a+1即可) 当上面都不满足时,直接用扩展的欧几里德算法求出x,在解方程求出y,两绝对值相加减一即可#include <cmath>#include <iostream>using namespace std;long long ex_gcd(long long a,long long b,long long &x,long 阅读全文
posted @ 2012-03-17 11:53 yejinru 阅读(186) 评论(0) 推荐(1) 编辑
摘要: 题目: 给出邮递员每天要走的路线,要你求出最小的消耗分析: 注意每一个字符串如three,表示邮递员起始于t,要走到e,而此时所消耗为字符串的长度, 你要确定跑遍所有这些街道所需的最小旅程。旅程结束时必须回到起点的路口。注意到题目给出 奇数度的顶点不超过两个,就是说有且只有两个,或者一个没有,所以根据欧拉回路可知,如果 没有奇数顶点的话,直接输出所输入的总字符串长度即可。如果有两个奇数顶点的话,还要加上 两个顶点之间的距离,就是说可能要求任意两顶点之间的距离,涉及到题目的输入规模最大不过为 26,用floyd算法即可O(n^3)#include <iostream>#include 阅读全文
posted @ 2012-03-15 20:47 yejinru 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 做完整数划分那题后,现在感觉这道题很简单,状态转移方程为dp[i][j] = dp[i][i] j>i = dp[i-j][j-1]+dp[i][j-1]建议看看我的博客上的hoj1402题#include <iostream>#include <cstring>using namespace std;#define X 510long long dp[X][X],n;void init(){ memset(dp,0,sizeof(dp)); for(int i=1;i<X;i++) //初始化 { dp[1][i] = 1; dp[0][i] = 1; } 阅读全文
posted @ 2012-03-13 21:17 yejinru 阅读(125) 评论(0) 推荐(0) 编辑
摘要: /*整数划分是一个经典的问题。希望这道题会对你的组合数学的解题能力有所帮助。Input 每组输入是两个整数n和k。(1 <= n <= 50, 1 <= k <= n)Output 对于每组输入,请输出六行。 第一行: 将n划分成若干正整数之和的划分数。 第二行: 将n划分成k个正整数之和的划分数。 第三行: 将n划分成最大数不超过k的划分数。 第四行: 将n划分成若干奇正整数之和的划分数。 第五行: 将n划分成若干不同整数之和的划分数。 第六行: 打印一个空行。第一行和第三行: 对于第一行和第三行,根据状态转移方程很容易写出: dp[i][j] = dp[i][i] 阅读全文
posted @ 2012-03-13 20:55 yejinru 阅读(371) 评论(0) 推荐(1) 编辑
摘要: 题目: 求最长的重量上升且iq下降的子序列分析: 其实就是最长上升子序列的变形,其实很简单,先按重量按照由小到大进行排序, 然后就是LIS的事,打印路径的话,用数组path[]记录后面的位置,利用 递归实现打印(具体参考算法导论)#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define X 1005int dp[X],path[X];struct node{ int iq,w,id; //记录iq,重量 阅读全文
posted @ 2012-03-09 16:40 yejinru 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 简单枚举#include <iostream>#include <string>using namespace std;int main(){ freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); string s; while(cin>>s,s!="*") { int len = s.size(); bool flag = true; for(int i=1;i<len-1&&a 阅读全文
posted @ 2012-03-03 22:27 yejinru 阅读(115) 评论(0) 推荐(0) 编辑
摘要: /*题目: 求最少时间从(0,0)走到(4,4)的路径分析: 纯粹BFS题目,不过需要打印路径,可以用数组记录当前的坐标的上一个坐标, 因为BFS构造出一棵BFS最优生成树,每一个节点的父母节点都是唯一的,具体 参考算法导论。。。*/#include <iostream>#include <cstring>#include <cstdio>#include <queue>using namespace std;#define X 6int map[X][X],pre[X][X];bool visit[X][X];struct node{ int 阅读全文
posted @ 2012-03-01 22:02 yejinru 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 编辑器加载中...题目: 给出一些树名,问每一棵树的所占的比例分析: 就是给树按字典序排序,并输出他们所占的比例,由于本题涉及的树名比较多,可以采用 二分搜索树来做,然后按照中序遍历即可#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 50int cnt;struct node //树的结构体{ int id; //储存个数的 char name[X]; //储存名字 node *rchild; //右子树 node *lchild; //左 阅读全文
posted @ 2012-03-01 12:31 yejinru 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 中国剩余定理例1:一个数被3除余1,被4除余2,被5除余4,这个数最小是几?题中3、4、5三个数两两互质。则〔4,5〕=20;〔3,5〕=15;〔3,4〕=12;〔3,4,5〕=60。为了使20被3除余1,用20×2=40;使15被4除余1,用15×3=45;使12被5除余1,用12×3=36。然后,40×1+45×2+36×4=274,因为,274>60,所以,274-60×4=34,就是所求的数。例2:一个数被3除余2,被7除余4,被8除余5,这个数最小是几?题中3、7、8三个数两两互质。则〔7,8〕=56;〔3, 阅读全文
posted @ 2012-02-29 22:41 yejinru 阅读(231) 评论(0) 推荐(0) 编辑