摘要: 这道题是一道搜索题,不过貌似蛮经典的,网上的解题报告不少。 这道题可以逐个填充长棒,填完一根再填充下一根。 这里就只强调一下剪枝策略: 1. 排序,因为从大到小对棒子进行排序,先填充大棒子,以减少搜索空间; 2.所求棒的长度一定是总长度的一个约数; 3.当枚举到第n-1根棒子时,就不用枚举了; 4.设置标志数组,记录棒子是否被访问过; 5.去除长度相同的不可用的棒子; 暂时只能想到这几种剪枝策略,不过推荐一组数据:6440 40 30 35 35 26 15 40 40 40 40 40 40 40 40 40 40 40 40 40 4040 40 4... 阅读全文
posted @ 2012-04-27 23:26 LETTers 阅读(104) 评论(0) 推荐(0) 编辑
摘要: 这道题看着很简单,但确实有些出人意料的地方。 首先,这道题需要用这个式子去算: 然后,在计算过程中,用二分的思想,即Mn = Mn/2 * Mn/2,Mn/2 = Mn/4 * Mn/4,... 阅读全文
posted @ 2012-04-27 22:48 LETTers 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 这个题等价于求将长度为2k的序列A = {1,2,...,2k}划分为两个长度为k的递增子序列B = {b1,b2,...,bk} 和 C = {c1,c2,...,ck},对任意i属于1到k满足bi < ci 的划分方式总数。 一个满足条件的划分等价于: 有两个栈,一个叫A,一个叫B,元素从小到大依次入栈,但是必须满足B栈的长度在任意时刻不小于A栈的长度。比如,如果有六个数1到6,则下图是一种入栈方式: 很明显,这是一个Catalan数了。View Code 1 #include <stdio.h> 2 const int MAX = 41; 3 long long num 阅读全文
posted @ 2012-04-27 22:23 LETTers 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 这道题和上次周杰出的相似三角形题,是我们校队在2011区预赛中做对的唯一的两道题,最终校队是以罚时的微弱劣势丧失银牌~解题思路很多种,这里提供一种自己的思路首先题目求解最小生成树(MST);这里用Prim算法并把最小生成树边的集合存起来;然后依次去掉每条边,考虑这个n-2边的图,两个for循环依次枚举这两个连通图上的点;得出最优值。View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 const int maxn=1000+10; 5 typedef struct 6 阅读全文
posted @ 2012-04-25 21:30 LETTers 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 这是其它国家区预赛的题目,大家可以看出来区域现场赛最简单题的难度。解题的思路很容易想到,四则运算处理可能比较麻烦~但是经过细心调试应该问题不大;还有就是排列的生成可以自己写,但是这里提倡用next_permutation()函数!还有一点是要注意结束的判断。 以下是参考解题程序:View Code 1 #include<stdio.h> 2 #include<stack> 3 #include<algorithm> 4 #include<ctype.h> 5 #include<string.h> 6 using namespace s 阅读全文
posted @ 2012-04-25 21:27 LETTers 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 状态为DP[x][y][z]=DP[x-1][y][z-1]+DP[x][y-1][z]+DP[x][y][z-1];注意一点数值为长整型!#include<stdio.h>#include<string.h>const int maxn=20;__int64 f[maxn][maxn][maxn];int vis[maxn][maxn][maxn];__int64 Solve(int a,int b,int c){ if(a<0||b<0||c<0)return 0; if(vis[a][b][c])return f[a][b][c]; vis[a] 阅读全文
posted @ 2012-04-25 21:25 LETTers 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 1004UnitFractionPartition(POJ1980)解题思路:DFS+剪枝。这题的剪枝条件还是比较严格的,很容易超时,我想到的需要剪枝的情况有以下几点:①前几项的和超过了最大值。②前几项的积超过了最大值。③深度超出。④提前“预测”剪枝:即如果剩余的项数乘以当前最小分数要大于剩余的值,则不应该往下搜索。第④点是至关重要的,没有考虑到的话一般会超时。还有可以优化的地方就是避免用实数类型,一是精度难以把握,而是实数运算相对整数运算要慢。代码如下:#include <cstdlib>#include <iostream>using namespace std;i 阅读全文
posted @ 2012-04-24 22:41 LETTers 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 1003TheEmbarrassedCryptographer(POJ2635)解题思路:高精度求模+同余模定理+素数打表。注意以下几点:①素数表不能只打到10^6,必须保证素数表中的最后一个大于10^6。②读入大数后用千进制(或万进制,十万进制……),用十进制可能会超时。代码如下:#include <cstdlib>#include <iostream>using namespace std;char key[105];int keyLen = 0;int num[105];int numLen = 0;int primes[1000005];int cnt = 0; 阅读全文
posted @ 2012-04-24 22:23 LETTers 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 1002Babelfish(POJ2503)解题思路:字符串的哈希,找一个比较好的hash函数就可以了,冲突时用链表的形式组织。用STL中的map等容器也可以过,不过性能差点。代码如下:#include <cstdlib>#include <iostream>using namespace std;#define N 1000005#define HASH 3999971struct node{ char a[11]; char b[11]; int next;};struct node words[N];int head[HASH];int t = 0;int inl 阅读全文
posted @ 2012-04-24 22:10 LETTers 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 1001BasicallySpeaking(POJ1546)基本思路:基本的进制转换,先转化成十进制再转化成目标进制即可。代码如下: 1 #include <cstdlib> 2 #include <iostream> 3 #include <cmath> 4 5 using namespace std; 6 7 int a = 0; 8 int b = 0; 9 char aNum[10];10 char bNum[10];11 12 void solve()13 {14 int i = 7;15 int j = 0;16 int ans = 0;17 i 阅读全文
posted @ 2012-04-24 22:03 LETTers 阅读(165) 评论(0) 推荐(0) 编辑