- 博客(55)
- 收藏
- 关注
原创 POJ-1730(pow精度wa到吐血)(Perfect Pth Powers)
int main(){ double n; int i; while (scanf("%lf", &n) == 1 && n) { int tag = 0; if (n < 0) { tag = 1; n = -n; } if (n == 1) {
2012-03-31 16:57:33 615
原创 POJ-1072(平衡三进制)(Eva's Balance )
将n用-1,0,1表示,如20=1*3^3+(-1)*3^2+1*3^1+(-1)*3^0所以20+3^0+3^2=3^1+3^3即1,9 3,27平衡三进制具体转化方法先转化为用0,1,2表示的3进制,然后通过“借位”转换若对应的系数为2,则变为-1,下一位+1若对应的系数为3,则变为0,下一位+1为0或1时不变原理即是如果第i位为1,可以用砝码抵消,如果是2
2012-03-31 16:20:17 1387
原创 POJ-1455(换位置)(Crazy tea party )
【题目描述】围着桌子坐着n个人,现在要将每个人左右的人交换一下,最少交换多少次?【解题思路】如果奇数个人,找一个基准点如果偶数个人,找两个基准点(注意特殊处理除了基准点还有奇数对数的情况,详见代码)int main(){ int cases; cin>>cases; while (cases--) { int x; cin>>x; if (x <= 2) p
2012-03-29 17:08:33 629
原创 POJ-1384(完全背包)(Piggy-Bank)
【题目描述】已知储蓄罐满时的质量f以及空时质量e,有n种硬币,每种硬币的价值为p,质量为w,求该储蓄罐中的最少有多少钱?int p[501], w[501];int dp[50005];int main(){ int cases; cin>>cases; while (cases--) { int e, f; cin>>e>>f; int W = f - e;
2012-03-29 15:09:29 1573
原创 POJ-1305(勾股定理)(Fermat vs. Pythagoras)
这个题目就是找在1~N之间互质的三个正整数x、y、z,并满足x^2+y^2=z^2,判断这样的数有多少对,以及跟1~N中与这些互质正整数无关的正整数的个数。其实比较关键的是对上面那个式子 x^2+y^2=z^2 进行变形,减少一个变量为(r^2-s^2)^2 + (2*r*s)^2 = (r^2+s^2)^2,这样只有两个变量存在,可以减少一轮循环。于是题目就变成了找这样的r和s,当r
2012-03-29 13:04:11 593
原创 POJ-1260(经典动归,选择或是不选择)(Pearls)
【题目描述】现在要买若干种价值的珍珠,但买某种珍珠必须多付10颗此种珍珠的价钱,一颗珍珠可以用比它贵的珍珠充数,因此有时候用贵的珍珠来代替便宜的可能更省钱,输入要买的若干种珍珠,在可用高价珍珠充数的条件下,问最少需要花费多少钱.int d[105][2];int dp[105][105];int main(){ int t, n; cin>>t; while (t--) {
2012-03-29 12:14:18 1606
原创 POJ-1019(变繁琐打表为简单循环)(Number Sequence)
/*==========================================================*\| 11212312341234512345612345671234567812345678912345678910| 求第n个数字。| 首先求出在那一组,其中[1],[12][123]等是一组| 然后求出在哪一个数,最后确定哪一位\*===============
2012-03-29 10:32:03 776
原创 POJ-1159(把一个字符串变成回文串需要多少步操作)(Palindrome)
/*==========================================================*\| 动态规划| 设ch[1]..ch[n]表示字符串1至n位,i为左游标,j为右游标 ,则i从n递减,j从i开始递增。| min[i][j]表示i和j之间至少需要插入多少个字符才能对称,初始置全0 ,| 我们最终需要得到的值是min[1][n].| PS:short
2012-03-29 10:04:54 1238
原创 C缺陷和陷阱
一、词法陷阱1.x---y与x- --y是不一样的。2.int x = 'aaa'; /* char x,在VS中结果是最后一个字符的值 */ printf("%x\n", x); /* 616161 */3.C语言不允许嵌套注释4.写一个测试程序,无论是允许嵌套注释的编译器和不允许的都能够通过编译,但是结果不同。 /*/*/0*/**/1 允许的会翻译
2012-03-27 18:12:44 1176
原创 POJ-2897(直接模拟,观察错误情况)(Dramatic Multiplications )
实在没啥好说的,仅作留念int main(){ int t; scanf("%d", &t); while (t--) { int a, b; scanf("%d%d", &a, &b); int d[1000]; d[0] = b; int index = 0; int flag = 0; while (1) { int tmp = d[index]
2012-03-27 14:47:25 579
原创 POJ-3630(静态trie树,动态分配空间会TLE)(Phone List)
自己写了个动态的trie被tle了,悲剧此题还能够先排序,然后用strncmp就可以判断字符串是否被后面的包含。代码如下:bool cmp(char *x,char *y){ return strcmp(x,y)<0;}int main(){ int cases,number,x,i,j,flag; char **d=new char*[10000]; for(i=0;
2012-03-27 14:10:41 927
原创 POJ-3681(搜能包住m个点的最小矩形面积)
直接上codeint m, n;struct point{ int x, y;} wo[205];bool cmp(point a, point b){ if (a.x < b.x) return true; if (a.x == b.x) return a.y < b.y; return false;}int main(){ int cases, i, j, k;
2012-03-26 17:48:03 650
原创 POJ-3720(分数的小数表示,只要循环节)(Occurrence of Digits)
int main(){ int i, j; int d[105][15] = {0}; for (i = 2; i <= 100; ++i) { int ans = 1; int visit[105] = {0}; visit[ans] = 1;//重点 while (1) { int t = ans * 10 / i; d[i][t]++; ans =
2012-03-26 17:15:13 778
原创 POJ-3740(dfs边界点和还原处理)(Easy Finding)
【题目描述】选出一些行使得这些行构成矩阵的每一列都有且只有一个1。【接替思路】直接判断每一行是否选中。此方法并不高效。int m, n;int Map[16][300];bool used[300];bool Find;bool match()//判断所选取的行是否让每一列都恰好有一个1{ int i; for (i = 0; i < n; ++i) if
2012-03-26 15:38:38 728 1
原创 【编程之美】3.9已知先序和中序遍历,求后序遍历+POJ-2255
很久以前写过,现在把我的递归版本代码贴出struct tree{ char c; struct tree * left_child; struct tree * right_child;} * root;tree * create_tree(char pre[], char in[], int len){ if (len == 0) return NULL; tree * t
2012-03-23 09:50:15 1208
转载 【编程之美】精确表达浮点数
转自hi,baidu【问题描述】: 在计算机中,使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如:0.9 = 9/100.333(3)= 1/3(括号中的数字表示是循环节)当然一个小数可以用好几种分数形式来表示。如:0.333(3)= 1/3 = 3
2012-03-22 10:49:35 616
原创 【编程之美】寻找发帖水王+SOJ-2399+SOJ-2861+SOJ-2862
【题目描述】有一组数,很多很多个数,里面有一个数出现了超过一半次,请你把它找出来.int find_over_half(int d[], int n){ int i, sum = 0, t; for (i = 0; i < n; ++i) { if (sum == 0) { t = d[i]; sum = 1; } else { if (d[i] == t)
2012-03-22 10:43:45 7232 1
转载 【编程之美】不要被阶乘吓倒+SOJ-1159
转自人人网。阶乘(Factorial)是个很有意思的函数,但是不少人都比较怕它,我们来看看两个与阶乘相关的问题:1. 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。2. 求N!的二进制表示中最低位1的位置。分析与解法有些人碰到这样的题目会想:是不是要完整计算出N!的值?如果溢出怎么办?事实上,如果我们
2012-03-21 17:41:32 629
原创 【编程之美】桶中取黑白球+SOJ-3261
SOJ-3261只是把黑球和白球交换,对于SOJ来说,结果只和黑球数量有关,而下面的只和白球数量有关。【题目描述】有一个桶,里面有白球、黑球各100个,人们必须按照以下的规则把球取出来:1、每次从桶里面拿出来两个球;2、如果是两个同色的球,就再放入一个黑球;3、如果是两个异色的球,就再放入一个白球;问:最后桶里面只剩下一个黑球的概率是多少?【解题思路】思路1:找
2012-03-21 16:11:49 1052
原创 POJ-2084(Catalan数专题)(Game of Connections )
首先给出Catalan数的计算公式Catalan=C(2*n,n)/(n + 1)。【解题思路】这道题目是典型的凸多边形划分问题,直接套用公式即可。SOJ-2114(栈):典型的出栈顺序问题。SOJ-2404(The midterm exam of algorithm):典型的二叉树个数问题。SOJ-1247(球迷购票问题):【题目描述】球赛门票的售票处规定每位购票者限购一
2012-03-21 15:02:31 901
原创 POJ-3233+3070(矩阵加、乘、乘方)()
题意:已知一个n*n的矩阵A,和一个正整数k,求S = A + A2 + A3 + … + Ak。思路:矩阵快速幂。首先我们知道 A^x 可以用矩阵快速幂求出来(具体可见poj 3070)。其次可以对k进行二分,每次将规模减半,分k为奇偶两种情况,如当k = 6和k = 7时有: k = 6 有: S(6) = (1 + A^3) * (A + A^2 + A^3) = (1
2012-03-20 20:58:39 533
原创 POJ-3259(bellman-ford判断有没有负权路)
算法导论362页,例子#define EDGE 2505 * 4#define N 505 * 2struct EDGE_{ int x, y; int value;} e[EDGE];int n, edge;//n是顶点数,m是边数int d[N + 5];/*2 5 7 3 1 2 6 1 3 7 2 4 5 2 3 8 3 5 9 5 1 2 5 4
2012-03-20 19:58:20 2627
原创 POJ-3273(另类二分)
【题目描述】给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值【解题思路】一开始二分的上界为n天花费的总和(相当于分成1份),下界为每天花费的最大值(相当于分成n份),然后二分,每次的mid值为(上界 + 下界)/ 2,然后根据mid值遍历n天花费,对n天的花费进行累加,每当超过mid值 份数+
2012-03-20 18:43:30 834
原创 POJ-3274(hash结构)(Gold Balanced Lineup )
大概意思就是:数组sum[i][j]表示从第1到第i头cow属性j的出现次数。所以题目要求等价为:求满足sum[i][0]-sum[j][0]=sum[i][1]-sum[j][1]=.....=sum[i][k-1]-sum[j][k-1] (j中最大的i-j将上式变换可得到sum[i][1]-sum[i][0] = sum[j][1]-sum[j][0]su
2012-03-20 17:07:22 598
原创 POJ-1226(后缀数组)(Substrings)
可以暴力破解,这里贴的代码没有模版int who[Max], yes[101], ii;int len, n, nn;int ans[Max], ss;int check(int mid){ int i, j, k, t, s, flag = 0; for (i = 2; i <= len; i = j + 1) { for (; height[i] < mid && i <=
2012-03-20 15:37:03 476
原创 【*】后缀数组(dc3算法构造)
const int Max = 200001;int num[Max];int r[Max * 3], sa[Max * 3];int rank[Max], height[Max];int wa[Max], wb[Max], wv[Max], wd[Max];#define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb))#define G(x) ((x
2012-03-20 14:52:35 1718
原创 【*】POJ-3294(后缀数组)(Life Forms)
/*==========================================================*\| 后缀数组:| 这里num[0, n-1]为有效值,就是输入的字符串稍稍转化而成的数组| sa[1~n]为有效值,sa[i]=a则代表排在第i位的是第a个后缀。 a属于[0~n-1]| rank[0~~n-1]是有效值 rank[i]=b则代表第 i 个后缀排在
2012-03-20 14:39:05 539
原创 【*】后缀数组(初步接触)
有点难以理解,大概知道意思。需要日后深入研究。const int Max = 20001; int num[Max];int sa[Max], rank[Max], height[Max];int wa[Max], wb[Max], wv[Max], wd[Max];int cmp(int *r, int a, int b, int l) { return r[a] == r[b
2012-03-19 21:37:53 419
原创 POJ-3278(bfs定界和标记)(Catch That Cow)
【题目描述】给出a和b,a通过操作+1;-1;*2;至少几步能够到达b。【解题思路】首先要想到用bfs要点1:有个搜索上界就是b*2;要点2:对访问过的点要标记,避免重复搜索。struct my{ int x, ans;} wo;int flag[1000005];int main(){ int a, b; while (scanf("%d%
2012-03-19 13:30:02 567
原创 POJ-2588(snakes,抽象成图结构)
【转载思想】题目意思就不说了,这里主要说一下做法!我们把蛇连同它的攻击范围看做一个圆,再把圆抽象成一个点!点与点之间有边连接仅当两个点代表的圆有公共面积!然后我们在把上边界和下边界各抽象成一个点(S和T),同样上边界与点之间有边连接仅当点代表的圆与上边界相交,同理,可得下边界与点之间的边关系!这样处理以后如果有从左到右的路径,当且仅当不存在S到T通路!只要深搜或者广搜即可!但是题目还要
2012-03-16 16:16:05 989 1
原创 POJ-2513(trie+并查集+欧拉回路)
自认为此题有个bug#define NUMBER 500005int p[NUMBER + 5];int rank[NUMBER + 5];void make_set(int x) { p[x] = x; rank[x] = 0;}int find_set(int x) { if (x != p[x]) p[x] = find_set(p[x]); return p[x];
2012-03-16 12:41:25 2145
原创 POJ-2507(另类变态二分法)
二分求未知数int main(){ double x, y, c; while (cin>>x>>y>>c) { double low = 0.0; double high = y; double mid; while (low <= high) { mid = (low + high) / 2; double test = c * (sqrt(x * x -
2012-03-15 17:36:48 45840
原创 POJ-2504(简单几何)
【解题报告】已知三角形的顶点坐标为(xx1,yy1),(xx2,yy2)和(xx3,yy3),要求外接圆圆心坐标(x,y),有圆心O到三个顶点A,B,C距离相等,可得两个方程,联立求解这两个方程,即可得外接圆圆心坐标,而根据已经求得的圆心坐标和向量旋转公式就可以求出正多边形其它顶点的坐标,将向量OA逆时针旋转t角度的向量OB,则向量旋转公式为:(B点坐标为(xx,yy),A点坐标为(xx1,yy1
2012-03-15 15:59:50 819
原创 POJ-2502(需要自己建图的Dijkstra)
居然不知道Dijkstra是个什么玩意儿了,悲催struct point{ int x; int y;} p[505];double d[505][505];double distance(int x1, int y1, int x2, int y2){ return sqrt(1.0 * (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2
2012-03-15 14:35:40 498
原创 POJ-2559(单增栈)
【题目描述】给出一系列的1*h的矩形,求矩形的最大面积。如图:可转化为求找一个子序列。 使得这个序列的长度乘以序列最小数最大。分析:这是一个单调栈的问题,维护栈单调不减。 单调栈 主要是大家要自己枚举,需要找到每个元素 最左能扩展到那 ,最右能扩展到那,当然最小的是你枚举的那个元素。struct my{ ll h; int id;} wo[100005];ll d
2012-03-15 11:49:16 2540
原创 POJ-2591(经典打表)
【Description】Set S is defined as follows: (1) 1 is in S; (2) If x is in S, then 2x + 1 and 3x + 1 are also in S; (3) No other element belongs to S. Find the N-th element of set S, if we so
2012-03-14 18:23:03 688
原创 POJ-2479&2593(最大两段和)
【题目描述】 给出一个长度小于或等于1000的序列,求出两个子序列,让其和最大,输出最大和。比如例子的1 -1 2 2 3 -3 4 -4 5 -5结果就是 {2,2,3,-3,4} and {5},也就是要输出最大和13【解题思路】在输入的同时,进行一次动态规划,计算出从左到右的最大值,并把它保存在数组dp的对应的下标元素中,这样之后,对于下标为i的元素, 它其中保存的便是前
2012-03-14 18:01:13 444
原创 SOJ-2710(处理点和直线)
【问题描述】有n个点,问这n个点每两个点连接,不能有点在连接的直线上方,这种点对有多少。【解题思路】求每个点与它之前的点是否能成一对,从此结点往前扫描,遇到一个点, 如果比维护的高度高,那么这个点就和原来的点组成一对,并把维护的高度记成这个点 否则跳过此点,扫描更前面的点。struct my{ ll x; ll y;} wo[2005];bool cmp(my
2012-03-14 12:27:50 310
原创 SOJ-2708(简单dp,不会怎么记录路径)
参考了别人记录结果路径的方法,其余为自己所想double a[30];double d[30][30];double ans[10005][30];int path[10005][30];char s[10000];void process(char c){ int i; switch (c) { case '2': for
2012-03-14 09:58:00 470
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人