上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 17 下一页
摘要: 计算几何题目推荐计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠。3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板。如果代码一片混乱,那么会严重影响做题正确率。4.注意精度控制。5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2)。因为整数不用考虑浮点误差,而且运算比浮点快。一。点,线,面,形基本关系,点积叉积的理解POJ 2318 TOYS(推荐)http://acm.pku.edu.cn/JudgeOnline/problem?id=2318POJ 2398 Toy 阅读全文
posted @ 2012-07-15 18:02 'wind 阅读(903) 评论(0) 推荐(0)
摘要: 1062*昂贵的聘礼枚举等级限制+dijkstra1087*APlugforUNIX2分匹配1094SortingItAllOutfloyd或拓扑1112*TeamThemUp!2分图染色+DP1125StockbrokerGrapevineFLOYD1135DominoEffect最短路1149*PIGS网络流1161*Wallsfloyd1201Intervals差分约束1236*NetworkofSchools强联通1251JungleRoadsMST1273DrainageDitches最大流 1274ThePerfectStall2分匹配1275*CashierEmployment差 阅读全文
posted @ 2012-07-15 18:00 'wind 阅读(837) 评论(0) 推荐(0)
摘要: 题意: 给一个有 n 个节点的有向图,和 m 条有向边,问这个图中是否任意两个点都能互达。分析: 任意两个点能够互达,即要求图的强连通分量的个数为一,求出图的强连通子图的个数即可。PS : Tarjan算法 详解 http://www.byvoid.com/blog/scc-tarjan/code:#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))const int maxn=100010;struct node{ int to; int next;}q[100010];int h 阅读全文
posted @ 2012-07-14 21:06 'wind 阅读(218) 评论(0) 推荐(0)
摘要: 题意:有n 个小巫师,还有 m 个小精灵 ,还有 K 个大树,巫师可以用 霜冻新星杀死小精灵,但是每使用一次都有一定 的技能冷却时间,而且小精灵必须在攻击范围内。分析: 二分答案,即枚举符合条件的时间,满足所有小精灵被KO,由于每个巫师能够杀死多个小精灵,所以可以用到二分 图多重匹配,如果所有小精灵都找到匹配,那么该时间符合, 最麻烦的是建图,两个人之间必须不能有树阻挡,在 计算两个人所在线段与 树相交的时候 可以先计算点(树的坐标)到线段(巫师与小精灵连线)的最短距离,如果该 距离小于树的半径,那么该巫师和小精灵能够形成匹配。View Code #include<stdio.h> 阅读全文
posted @ 2012-06-25 15:19 'wind 阅读(253) 评论(0) 推荐(0)
摘要: 题意: 给出一个地图,起点 s,终点 t,和一个数 x,求出s到 t的最短路,且经过的路的条数是 x 的倍数。分析: 可以看成是二维的最短路,在 原dijkstra的基础上修改,从一个点到另一个点走的边数如果是 d, 那么从这个点到另一个点走的边数为 d+1, 只要对 X 取模,便能求出从 s 到 t 经过 x 的倍 数边的最短路径。#include<stdio.h>#include<string.h>const long long INF=9999999999;long long g[102][102];long long d[102][11];int v[102][ 阅读全文
posted @ 2012-06-23 08:10 'wind 阅读(292) 评论(0) 推荐(0)
摘要: 题意: 给 n 给任务,每个任务对应相应的截至时间和价值,总时间为 m ,每个任务消耗的时间为 1,问如何分配工作顺序可以得到最大价值。分析: 对任务按截至时间从大到小排序,从时间 t 开始,找到在符合时间 t 的最大价值的任务,然后 t--.View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>using namespace std;struct node{ int ti,va; const bool operator <(const s 阅读全文
posted @ 2012-06-22 21:52 'wind 阅读(224) 评论(0) 推荐(0)
摘要: 题意: 给一个固定大小的布料,给出n 个固定的尺寸,每个尺寸的布料对应一定的价值,问如何裁剪原来的布料能可以获得最大的价值。分析: 应为每个尺寸的布料都对应四种切法,(蓝色部分) 所以状态转移方程为: dp[i][j]=max(dp[i][j],max(d[i-ll][j]+d[ll][j-ww],d[i][j-ww]+d[i-ll][ww])+p); dp[i][j]=max(dp[i][j],max(d[i-ww][j]+d[ww][j-ll],d[i][j-ll]+d[i-ww][ll])+p);View Code #include<stdio.h>#include<s 阅读全文
posted @ 2012-06-16 16:37 'wind 阅读(225) 评论(0) 推荐(0)
摘要: 题意: 有 n 个国家,n-1 条道路,形成的树形地图,问图中有多少对城市距离为 K ...分析: 可以用 f[i][j] 表示以 I 为根的子树中有多少定点距离 i 为 j 。因为 f[i][j]=f[son1][j-1]+f[son2][j-1]....f[son(n)][j-1] 即每个 I 号根都可以由和它直接相连的孩子得到,这个过程可以利用树形搜索的方式来完成, 至于最终答案,只要逐个累加即可,例如 f[i][j] i 号节点得到的数目为 f[i][k]+f[son1][j]*f[son2][k-2-j] (son为i 的直接孩子)View Code #include<s... 阅读全文
posted @ 2012-06-08 01:31 'wind 阅读(225) 评论(0) 推荐(0)
摘要: 题意: 给一个n*m的方格,里面放着横竖的单词,问从里面最多可以选出多少组单词并使他们互不冲突。分析: 二分图最大独立权集,求出最大匹配数,总结点数减去最大匹配即为答案。View Code #include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))char map[2002][2002];int a[2002][2002];int link[505];int v[505];struct node{ int to,next;}q[1000000];int head[2002];int tot 阅读全文
posted @ 2012-06-06 23:57 'wind 阅读(203) 评论(0) 推荐(0)
摘要: 题意: 给一串字符,有三种操作'<' '>' '-' 表示左移,右移,删除,要求输出最后结果。分析: 建立双向链表模拟之...第一个用双向链表做的题,wa了N次。。。--!View Code #include<stdio.h>#include<string.h>#include<stdlib.h>struct node{ node *next; node *pre; char c;};char s[1000005];node *a[1000005];int main(){ int n; int to 阅读全文
posted @ 2012-06-06 23:16 'wind 阅读(220) 评论(0) 推荐(0)
摘要: 题意: 有 n 个萝莉,和 m 个怪叔叔,已知他们的坐标,且任意三个人不共线,要求从萝莉中任选三个人出来,且三个人 组成的三角形中不能包含怪叔叔,共有多少种取法。分析: 将萝莉的坐标按横坐标排序,用 f[i][j] 表示萝莉 i 到萝莉 j 的横坐标范围内,位于萝莉 i ,j上方的 怪叔叔数量,对于横坐标依次增加的 萝莉 i,j,k ,如果有 f[i][j]+f[j][k]=f[i][k], 则 萝莉 i,j,k 组成的三角形内不含有怪叔叔(画图能够看出)。 时间复杂度为 O(N^3)。View Code #include<stdio.h>#include<string.h& 阅读全文
posted @ 2012-06-05 23:31 'wind 阅读(207) 评论(0) 推荐(0)
摘要: 题意: 给一个起点和一个终点,然后给出 N 个互不相交的栅栏,问从起点到终点如果不穿过栅栏(可以接触)最少需要走多 远的距离。分析: 如果两个点所在线段,没有其它线段与之相交,则可以在两点之间连一条线段,最后只要求出起点到终点的最短距离即可, 时间复杂度O(N^3)CODE :View Code #include<stdio.h>#include<string.h>#include<math.h>double min(double a,double b){ return a<b?a:b; }double max(double a,double b){ 阅读全文
posted @ 2012-06-04 20:47 'wind 阅读(191) 评论(0) 推荐(0)
摘要: 题意:给一个树形的图,可以在任意一个位置建造游乐场,每个游乐场都有相应的造价,如果该节点建有游乐场,那么改点的人到该游乐场就不需要花费, 否则需要花费所在位置到游乐场的路径长度对应的费用,问怎么建游乐场能使得总花费最小。分析: 树形DP。 用 f[i][j] 表示以 i 为根节点的子树以 j 为游乐场的最小花费,为了便于状态转移,这个游乐 场先不计费,f[i][j] 中的最优的 j 一定是其某个子节点,这样就长生了最优子结构,所以计算 f[i][j]时 ,f[i][j] 的值可以由其子节点来确定,状态转移方程如下: f[i][j]=d[len[i][j]]+sum... 阅读全文
posted @ 2012-05-30 23:01 'wind 阅读(336) 评论(0) 推荐(0)
摘要: 题意: 给你一个矩形范围,让你在这个矩形内找一个漩涡状的区域,使得和最大。分析: 暴力枚举所有漩涡,有个注意的就是: 由于漩涡套漩涡,所以每个漩涡的值都等于该矩形区域的数字和减去刚好嵌在 该漩涡内的漩涡和左上角一个小缺口,画图很容易看出。View Code #include<stdio.h>#include<string.h>#define min(a,b)(a)<(b)?(a):(b)#define max(a,b)(a)>(b)?(a):(b)int c[500][500];int c1[502][502];int c2[502][502];int n, 阅读全文
posted @ 2012-05-24 20:03 'wind 阅读(224) 评论(0) 推荐(0)
摘要: 题意: 有一个 n 个点组成的凸多边形, 和 m 个点,问 M 个点是否全部严格在多边形内部。转大牛分析:考虑将一个凸包划分为N个三角区域于是可知对于某个点,如果不在这些三角区域内,那么必然不在凸包内否则,可以通过二分位置,得到点所在的区间之后只需要判断点 是否在区间所对应的原凸包的边的左边即可(逆时针给出凸包点顺序)假设我们查询绿色的点是否在凸包内,我们首先二分得到了它所在的区间,然后判断它和绿色的向量的关系,蓝色和紫色的点类似,蓝色的点在边界上,紫色的点在边界右边因此一个查询在O(logN)内解决 code:View Code #include<stdio.h>#include 阅读全文
posted @ 2012-05-23 13:50 'wind 阅读(4258) 评论(0) 推荐(0)
摘要: View Code #include<stdio.h>#include<string.h>#include<stdlib.h>struct node{ long long x,y;}p[50003],a[50003],t1;long long mul(node p1,node p2,node p3){ return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);}long long dis(node a,node b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b. 阅读全文
posted @ 2012-05-20 21:25 'wind 阅读(250) 评论(0) 推荐(0)
摘要: 题意: 给你一个图HH. .m. . . . .. . . . .. . . . .mm. .Hm代表人 H 代表房子,一个人只能进一个房子,问你如何安排人进房,使得总步数最小。分析: 可以用最小费用最大流,也可以用二分图最有匹配。最小费用最大流#include<stdio.h>#include<string.h>#define min(a,b)(a)<(b)?(a):(b)#define inf 0x1f1f1fint ab(int x){ return x>0? x:-x;}int cap[500][500];int cost[500][500];int 阅读全文
posted @ 2012-05-19 12:36 'wind 阅读(261) 评论(0) 推荐(0)
摘要: 题意: 求单源最短路,起点为1,终点为 n .分析: SPFA 加了点优化。。。View Code #include<stdio.h>#include<string.h>#define INF 0x1f1f1fint n;int v[102],dis[102],g[102][102],q[102];void spfa(){ int rear,front,i,x; memset(v,0,sizeof(v)); front=rear=0; q[rear++]=1; dis[1]=0; v[1]=1; while(front<rear) { ... 阅读全文
posted @ 2012-05-18 22:43 'wind 阅读(211) 评论(0) 推荐(0)
摘要: 题意:有一个n * m的矩阵,每个元素都是非负的,每一行,每一列的边缘都有一个按钮(即n + m个),对应着第1行,第2行,第3行,…,第n行,第1列,第2列,第3列,…,第m列。每当他按下某个按钮,那么对应的一行或者一列的所有元素将减去1,值为0的元素不受到影响。他想知道,他最少需要按多少次按钮,能够将整个矩阵都变成0。分析: 有点类似最小点权覆盖,以行为 X 集合, 以列为 Y 集合,以 g[i][j] 为边权建立二分图,完美匹配下的最大权值即为答案, 最大权匹配算法要保证左右集合相等,因此在点不够的情况下要补点!!!View Code #include<stdio.h>#in 阅读全文
posted @ 2012-05-18 00:58 'wind 阅读(229) 评论(0) 推荐(0)
摘要: 题意:给你一个运动员的起始分数,分数为N,你需要计算出有多少种投掷飞镖的方式能够把分数降到0.不同的方式意味着:两两方式之间至少有一种方式的某个步骤和另一个不同,如果两个方式可以通过改变其中某种方式相应步骤的顺序来使其和另一个方式相同的话,这两种方式算作一种。分析:比较明显的母函数,只不过有个地方需要注意,就是要开两个数组来维护总的情况数,即 先求出不包含X2 的情况的组合数,然后用滚动数组c1 c2来存放至少含有一个X2的情况数,也就是 C数组里面存的都是符合条件的情况,c[j+step]+={ c[j] 里面的每种情况都符合要求 { tmp[j] 里面的每种情况都不符... 阅读全文
posted @ 2012-05-17 21:34 'wind 阅读(292) 评论(0) 推荐(0)
摘要: 分析: 给一个地图,一个人从起点开始,身上有一个定时炸弹,时间为6,每走一步花费一个时间,走到标号为4 的点上时时间重置, 问从起点到终点最少需要经过多少步。分析: 直接广搜,加上对状态的判重。。。View Code #include<stdio.h>#include<string.h>struct node{ int x,y,time,step;}q[1000],st,en,tt,xx;int f[8]={-1,0,0,1,0,-1,1,0};int a[10][10];int b[10][10];int v[10][10][7];int main(){ int fr 阅读全文
posted @ 2012-05-09 20:37 'wind 阅读(231) 评论(0) 推荐(0)
摘要: 题意: 给你n 木棍碎片,要求还原原木棍,且原木棍等长,问最短长度是多少。分析: 各种剪枝。View Code /*1:越长的木棍对后面木棍的约束力越大,因此要把小木棍排序, 按木棍长度从大到小搜索,这样就能在尽可能靠近根的地方 剪枝。 2:当出现加上某根木棍恰好能填满一根原始木棍,但由在后面的 搜索中失败了,就不必考虑其他木棍了,直接退出当前的枚举。 3:考虑每根原始木棍的第一根木棍,如果当前枚举的木棍长度无 法得出合法解,就不必考虑下一根木棍了,当前木棍一定是作 为某根原始木棍的第一根木棍的,现在不行,以后也不可能得 出合法解。也就是说每根原始木棍的... 阅读全文
posted @ 2012-05-09 00:55 'wind 阅读(247) 评论(0) 推荐(0)
摘要: 题意: 告诉你三个质数p1,p2,p3,因子只包含他们的数构成连续的一列数,问你第K个树 是什么。分析: 数列中的每一个数只可能由他前面的三个数转化而来,所以只要维护一个连续的三个数就行。View Code #include<stdio.h>#include<string.h>__int64 min(__int64 a,__int64 b){ return a<b?a:b;}__int64 h[10000];int main(){ int a,b,c,i,k; __int64 p,q,r; while(scanf("%I64d%I64d%I64d%d&q 阅读全文
posted @ 2012-05-07 23:30 'wind 阅读(241) 评论(0) 推荐(0)
摘要: 题意: 有n 个敌人,告诉每个船的初始血量,攻击时告诉你一个区间,这个区间里面的船每个船的血变成以前的根号倍,询问的时候输出每个区间的总和。分析:注意的地方就是当这个区间的和等于区间长度时,就不用再更新。View Code #include<stdio.h>#include<string.h>#include<math.h>const int maxn=111111;__int64 sum[maxn<<2];void creat(int l,int r,int rt){ if(l==r) { scanf("%I64d",&am 阅读全文
posted @ 2012-05-07 20:52 'wind 阅读(222) 评论(0) 推荐(0)
摘要: 题意: 给你一个长度为 n 的桥,上面每个坐标分布相应数量的蚊子,告诉你一个青蛙从 0 开始向终点跳跃,最多跳 k 步,问你最多能吃多少个蚊子。分析: 状态转移方程 dp[i][j]=max(dp[i][j],dp[i-1][t]) j-r<=t<=j-l dp[i][j] 表示在 j 位置,走了 i 步的最大值。View Code #include<stdio.h>#include<string.h>#define max(a,b)(a)>(b)?(a):(b)int dp[200][103];int a[10002];int main(){ int 阅读全文
posted @ 2012-05-05 07:11 'wind 阅读(544) 评论(0) 推荐(0)
摘要: 题意: 给你一组数,让你求他的逆序数。分析: 数子比较大,直接用数组存不下,所以要进行离散话坐标。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>struct node{ int xu; int num;}q[500001];int cmp(const void*p1,const void*p2){ struct node*c=(struct node*)p1; struct node*d=(struct node*)p2; return c->num-d->num;} 阅读全文
posted @ 2012-05-03 21:15 'wind 阅读(181) 评论(0) 推荐(0)
摘要: 题意: 让你找出1 到 n 之间所有可以构成 x^2 +y^2 =z^2 的个数,且 x,y,z互质。分析:数论中有本原勾股数组的公式x=2*s*t,y=s*s-t*t,z=s*s+t*t;其中s>t>=1而且gcd(s,t)==1View Code #include<stdio.h>#include<string.h>#include<math.h>int gcd(int y,int x){ return x==0?y:gcd(x,y%x);}int v[1000001];int main(){ int n,x,y,z,t1,t2,i,j,k; 阅读全文
posted @ 2012-05-03 20:09 'wind 阅读(260) 评论(0) 推荐(0)
摘要: 题意: 有 n 个物品,有主件附件之分,买附件必须先买主件,问最后可以得到的价值最大是多少?分析: 分组背包的变形。View Code #include<stdio.h>#include<string.h>#define max(a,b)(a)>(b)?(a):(b)int w[100];struct node{ int to,next;}q[100];int head[61];int num[61];int tot;void add(int s,int u){ q[tot].to=u; q[tot].next=head[s]; head[s]=tot++;}in 阅读全文
posted @ 2012-05-02 20:17 'wind 阅读(328) 评论(0) 推荐(0)
摘要: 题意: 给你两条街,上面的街编号从 1-n 下面的也是,然后告诉你他们的一些边, 让你从中尽可能选出多的边,使他们两两之间没有交点。分析: LIS 的变形,把一条街看成有序的,求令一条街的最长递增子序列, 因为当 上面 i < j 时 有 f[i]<f[j]。View Code #include<stdio.h>#include<string.h>int d[500005];int l[500005];int bis(int len,int x){ int low=0,high=len-1,mid; while(low<=high) { mid=(l. 阅读全文
posted @ 2012-05-01 15:53 'wind 阅读(328) 评论(0) 推荐(0)
摘要: 题意: 给你一段含有 n 个数的序列,将它分成 m 份,问你这 m 份的最大值可以是多少。分析: 状态转移方程: dp[i][j]=max(dp[i][j-1],dp[i-1][k]) 1<k<j dp[i][j]表示 前 j 个数分成 i 组的最大值 ,其中,第 J 个数包含在分好的组里面。 可以用滚动数组 将上面的改成一维的。 View Code #include<stdio.h>#include<string.h>#define INF 9999999#define max(a,b)(a)>(b)?(a):(b)int a[1000007];in 阅读全文
posted @ 2012-05-01 10:31 'wind 阅读(481) 评论(0) 推荐(0)
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 17 下一页