11 2011 档案

置换群
摘要:看了几天置换群,一直没搞清楚定义是怎么回事,一个置换可以写成若干循环的乘积,那么如果置换求幂的话,一个循环不会跑到另一个循环里面去。我们可以简单理解为这几个位置的数来回换。poj3270给出一列数,求将这列数排成升序的最小花费,这里花费定义为交换两个数的和。例如给出一排数8 4 5 3 2 7,那么我们最终的状态为2 3 4 5 7 8,这里的轮换有(8 2 7)(4 5 3),这里8应该在第六个位置,而第6个位置是7,7应该在5这个位置,而第5个位置为2,2应该在1这个位置,这样就到了8所在的位置,我们称这是一个轮换。首先需要明确的一点是对于每个群,假设有k个数,那么我们需要交换k-1次得到 阅读全文

posted @ 2011-11-15 12:07 buptLizer 阅读(7687) 评论(0) 推荐(1)

poj3983 (24点)
摘要:给出4个数,只能添加+-*/或者()使得结果为24。思路:枚举,一共5*3^4.#include <iostream>using namespace std;double a,b,c,d;double f(double a,double b,int op){ if(1 == op) return a+b; if(2 == op) return a-b; if(3 == op) return a*b; return a/b;}//type表示加括号的方式,一共5种bool caculate(int p1,int p2,int p3,int type){ double ans=0.0; 阅读全文

posted @ 2011-11-10 21:56 buptLizer 阅读(828) 评论(0) 推荐(0)

poj1995快速幂取余
摘要:快速幂运算:View Code int pow(int a,int n){ int rs=1; while(n) { if(n&1) rs=rs*a; a=a*a; n=n>>1; } return rs;}快速幂取余://求a^b%n,O(logb)__int64 get_mi_mod(__int64 a,__int64 b,int n){ if(0 == a) return 0; if(0 == b) return 1; __int64 rs=1; while(b) { if(b&1) rs=(rs*a)%n; a=(a*a)%... 阅读全文

posted @ 2011-11-10 15:01 buptLizer 阅读(1136) 评论(1) 推荐(0)

poj3714 最近点对
摘要:最近点对,采用分治方法。过程:1对原数组依据x左标从小到大排序。2二分数组,左边求出最小值,右边求出最小值,我们求最小的。3找出对于左右两边的可能小于当前最小值的最近点对,更新最小值。这题目需要区分一下点,让我们求的是闪兵到任意一个核电站的最短距离,加一个标志就可以了。代码:#include <iostream>#include <stdio.h>#include <iomanip>#include <algorithm>#include <cmath>using namespace std;const int N=200000+1; 阅读全文

posted @ 2011-11-08 16:42 buptLizer 阅读(2968) 评论(0) 推荐(0)

poj2079 求最大的三角形面积
摘要:这个题说给出一堆点,求最大的三角形面积。我们知道这三个点肯定在凸包上,我们求出凸包之后不能枚举,因为题目n比较大,枚举的话要O(n^3)的数量级,所以采用旋转卡壳的做法:首先确定i,j,对k进行循环,知道找到第一个k使得cross(i,j,k)>cross(i,j,k+1),如果k==i进入下一次循环。对j,k进行旋转,每次循环之前更新最大值,然后固定一个j,同样找到一个k使得cross(i,j,k)>cross(i,j,k+1)。对j进行++操作,继续进行下一次,知道j==k为止。关键代码:void rotating_calipers(){ double ans=0.0,are; 阅读全文

posted @ 2011-11-08 16:41 buptLizer 阅读(698) 评论(0) 推荐(0)

poj2187 最远点对问题
摘要:这个题用旋转卡壳做的,对于问题规模比较大时就可以体现出来他的优势了。凸包上的点依次与对应边产生的距离成单峰函数,我们首先固定一条边,然后找到第一个k,使得(i,j,k)的叉积<(i,j,k+1)的叉积,这时更新最大值,然后枚举下一个边,这个复杂度是O(n)的,因为我们逆时针枚举边的时候,k也是逆时针变化的。关键代码:void rotating_calipers(){ int ans=0,d1,d2; int i,k; s[top+1]=s[0]; k=1; for(i=0;i<=top;++i) { while(cros(s[i],s[i+1],s[k])<cros(s[i] 阅读全文

posted @ 2011-11-08 16:40 buptLizer 阅读(594) 评论(0) 推荐(0)

poj1696 Space Ant
摘要:题目让找出一条最长的非右拐的路径。每次找到一个基准点p0,最开始的时候是最左下角的点,然后我们再从未访问的点中找到相对于p0最小极角的那个点,比较极角用叉积来计算,所以我们总是每次迭代总是用此次循环中找到的最小极角来代替p0,然后再以这个新的p0,找到剩下的点中的最小极角,这样我们找到的就是一条最大的不右转的路径了。代码:#include <iostream>#include <stdio.h>using namespace std;const int N=50;const int INF=10000;struct node{ int id,x,y; node oper 阅读全文

posted @ 2011-11-08 16:38 buptLizer 阅读(576) 评论(0) 推荐(0)

凸包
摘要:凸包模板:struct Point{ int x,y; Point operator =(const Point & p) { x=p.x; y=p.y; return *this; }};Point m[N+2],s[N+2];int cro(Point p0,Point p1,Point p2){ return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);}double dis(Point p1,Point p2){ return sqrt(double((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p 阅读全文

posted @ 2011-11-08 16:35 buptLizer 阅读(217) 评论(0) 推荐(0)

poj1338 寻找丑数
摘要:poj 1338,2247,2545,2591这几个都是类似的题目,就是将满足要求的数列出来,给出一个n,问你第n个数是多少?以1338为例:对于每一个质数2 3 5,我们都要找到对应的之前已经计算出的最小的丑数使之乘以这个质数后大于当前的丑数,然后再从这三个里取最小的那个,我们记录三个数a2,a3,a5,分别保存对应的质数计算到哪个下标了,然后更新所有质数对应的下标,使之乘积大于当前的丑数。#include <iostream>using namespace std;const int M=1501;int ans[M];int getMin(int a,int b,int c) 阅读全文

posted @ 2011-11-03 09:45 buptLizer 阅读(1715) 评论(0) 推荐(0)

导航