上一页 1 2 3 4 5 6 7 8 ··· 17 下一页
摘要: 题意: 求最大流。分析: 用书上的模版各种超时,需要预处理好距离。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<climits>#define min(a,b)(a)<(b)?(a):(b)const int INF=INT_MAX;const int maxn=100005;const int maxm=200005;struct node{ int from,to,next,c;}e[maxm];int tot;int head[maxn];void add( 阅读全文
posted @ 2012-09-09 20:39 'wind 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 题意: 找到线段上一点,使得其他单位到这一点的代价和最小。分析: 裸的三分。#include<stdio.h>#include<string.h>#include<stdlib.h>double ab(double x){ return x>0?x:-x;}struct node{ double x; double w;}q[50005];int n;double cal(double xi){ int i; double res=0; for(i=0;i<n;i++) { double t=ab(q[i].x-xi); r... 阅读全文
posted @ 2012-09-09 10:17 'wind 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了正多边形内部一个点和其他所有点的距离,假如此正多边形存在则输出此正多边形边长,否则输出 impossible。分析:二分多边形的边长,对于每一个边长求出对应的内角和,假如内角和小与 360,则此边长比实际值要小,否则大于实际边长。#include<stdio.h>#include<string.h>#include<math.h>const double eps=1e-6;const double P=acos(-1.0);double d[105];double ab(double a){ return a>0?a:-a; }int n 阅读全文
posted @ 2012-09-08 10:29 'wind 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 题意:知道了n 个房子的坐标,和m 个金矿的坐标,问可以选出多少个三个房子,使得这三个房子内部的金矿数为奇数。分析: 直接暴力枚举的时间复杂度是o(n^4),可以先进行预处理 定义数组dp[i][j] 表示在房子 i 和放在 j 之间连线的上方的金矿数量, 则 房子 i,j, k, 内部的金矿数为 sum = dp[i][j]-dp[i][k]-dp[j][k]#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define clr(x)memset(x,0, 阅读全文
posted @ 2012-09-06 18:50 'wind 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 题意: 有两条线段,在其中一条线段上移动的速度为 v1,在另一条线上速度为v2, 在其他地方移动速度为 r,问从其中一条线段的一个端点移动到另一个线段 的一个端点的最少时间。分析: 在其中一条线段上三分离开的点,枚举之后再进行一次三分求最优解,关键在于看出函数是凸性的。#include<stdio.h>#include<string.h>#include<math.h>const double eps=1e-6;struct node{ double x,y;};double dis(node a,node b){ return sqrt((a.x-b.x) 阅读全文
posted @ 2012-09-05 18:00 'wind 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 题意:找出一个0,1,矩阵分析: 转换思维的题啊,由一道让人不知如何下手的题,转换为了最短路基本思路就是把矩阵看做一个图,图中有n个点,1号点出度为1,n号点入度为1,其它点出度和入度相等,路径长度都是非负数,等价于一条从1号节点到n号节点的路径,故Xij=1表示需要经过边(i,j),代价为Cij。Xij=0表示不经过边(i,j)。注意到Cij非负且题目要求总代价最小,因此最优答案的路径一定可以对应一条简单路径。最终,我们直接读入边权的邻接矩阵,跑一次1到n的最短路即可,记最短路为path。漏了如下的情况B:从1出发,走一个环(至少经过1个点,即不能是自环),回到1;从n出发,走一个环(同理) 阅读全文
posted @ 2012-09-05 00:28 'wind 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 题意: 有n 个城市,一开始每个城市有一颗龙珠,有 m 个操作 T a b 将a城市的所有龙珠转移到 b 城市 Q a 输出a龙珠所在的城市,和该城市现有的龙珠的数量,和该龙珠被转移的次数分析: 并查集,x 的祖先f[x]记录x 所在城市,每次合并的时候更新路径上的点#include<stdio.h>#include<string.h>#define maxn 10011int city[maxn];int move[maxn];int f[maxn];int find(int x){ if(f[x]==x) return x; int t=f[x]; ... 阅读全文
posted @ 2012-09-04 23:48 'wind 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 题意: 求出包含样例所有子串的字符串的最小长度。分析: dp[i][j]表示在 i 状态下 ,以第 j 个字符串结尾的最优值。#include<stdio.h>#include<string.h>#define INF 0x1f1f1f1f#define clr(x)memset(x,0,sizeof(x))int min(int a,int b){ return a<b?a:b;}int dp[1<<16][16];int g[16][16];int add_s(char *s1,char *s2) // 求出 s2 串加在s1 串后增加的长度{ i 阅读全文
posted @ 2012-09-04 21:01 'wind 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 题意:知道了每个时间段的休息可以获得能量,和连续休息可以获得的能量。求在能休息慢m 分钟,且最长连续时间段不超过 r 所能获得的最大能量值。分析:dp[i][j][k] 表示到第 i 分钟休息了j 分钟,连续睡了k 分钟获得最大值。#include<stdio.h>#include<string.h>#define max(a,b)(a)>(b)?(a):(b)#define clr(x)memset(x,0,sizeof(x))int dp[505][55][55];int a[505];int main(){ int t,i,j,k,n,m,r; scanf( 阅读全文
posted @ 2012-09-02 14:18 'wind 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 题意:有 n 个鸟,知道了每只鸟的活动半径和每个鸟窝在一开的时候有的草的数量,有m 个草堆,每个草堆有一定数量的草,知道了每个草堆的位置, 所有能被鸟捡到即被鸟覆盖到地方的草到最后都会被捡完,问是否存在一种情况使得所有鸟最后拥有的草的数量不超过第一只鸟用有的草的数量。分析: 首先让第一只鸟将可以捡到的草全部捡完,这时候拥有的草的数量为第一只鸟最后所能拥有的最多的草的数量记为k,限制其他鸟可以拥有的 草的数量不超过 k,看最后这些鸟能否将能捡的草捡完。 建图: 源点 s=0,汇点 t=(n-1)+m+1 鸟的编号1..n-1,草堆编号n..n+m-1 在源点和每只鸟之间连一条边容量设为 k, 如 阅读全文
posted @ 2012-09-01 14:25 'wind 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个队伍,给出m 个关系,判断是否有环,或者有多种排序方式,或者排序方式唯一。分析:拓扑排序,如果在排序过程中出队的次数超过 N 说明有环,否则如果在同一层入队的有多个,则说明有多种情况。#include<stdio.h>#include<string.h>#include<math.h>#define maxn 10005#define clr(x)memset(x,0,sizeof(x))struct node{ int to,next;}e[1000005];int tot;int head[maxn];void add(int s,in 阅读全文
posted @ 2012-09-01 14:14 'wind 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题意:给图按黑白着色,求一种着色方案使得图中着黑色的顶点数最多且这些顶点相互之间都不相邻.分析: 求出补图的最大团即为答案。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 111int g[maxn][maxn];int res[maxn];int s[maxn];int sum;int n,m,sn,ans;void dfs(int r){ int i,j; if(r>n) { for(i=1;i<=n;i++) res[... 阅读全文
posted @ 2012-08-30 23:43 'wind 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 题意: 已知一个有 n 个点的五向图,有重边,找出找出一个边集,使得这些边去掉之后原图不连通,并且去掉的边的数目要尽可能的少。分析: 求最小割边集用o(n^3)的stoer-Wagner算法,用最大流会TLE。 算法详解 http://blog.sina.com.cn/s/blog_700906660100v7vb.html#include<cstdio>#include<cstring>#define INF 0x1f1f1f1f#define clr(x)memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b)# 阅读全文
posted @ 2012-08-30 13:41 'wind 阅读(1022) 评论(0) 推荐(0) 编辑
摘要: 题意: 有一个有n个点的无向图,已知 m 条边,每条边有权值和一个字母标号,字母标号有四种 'L' 'O' 'V' 'E' 要找一条从1点到n点去的一条路径,然后要求有LOVE的的条件下路径最短,如果有多条最短路,找LOVE最多的那条分析: 将每个点分为四个,代表L,LO,LOV, LOVE四种状态#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))const long long inf=1ll<<57;co 阅读全文
posted @ 2012-08-30 00:23 'wind 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 题意: 现有一个空的集合,有连续的 m 组操作 B x 将 x加入集合 A x 询问集合中的元素 y % x 的取得最小值的 y分析:鸽巢定理+线段树然后对每个y,由鸽巢定理,连续的y+1个数中必然存在mod y相同的数,可以多区间查询, 即[0, y - 1] [y , 2 * y - 1] 取最优解当y比较小的时候,直接遍历会更快,即当 y<log(n) 的时候采用遍历的方法 由于数据比较少,可以先进行离散化来提高效率。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))# 阅读全文
posted @ 2012-08-29 16:49 'wind 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 题意:有一个长度为 N 的墙,定义两种操作: 1 a b c 将 区间[a,b]涂成 c颜色 2 a b c 询问区间[a,b]中c颜色的的个数。分析 : 区间合并类线段树。#include<cstdio>#include<cstring>#define clr(x)memset(x,0,sizeof(x))#define maxn 100005#define max(a,b)(a)>(b)?(a):(b)#define min(a,b)(a)<(b)?(a):(b)int hi[maxn<<2];int lo[maxn<<2];in 阅读全文
posted @ 2012-08-27 21:44 'wind 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题意: 有n个人进行一场自行车竞速比赛,知道了每个人第1s走fi米,以后每秒走si米,一个人扔钉子破坏比赛,每秒他都选最靠前的那个人,如果有多个人,选编号最小 的那个,问你这些人依次被破退出比赛的顺序。分析: Si最大只有100,可以建立优先队列数组s[1..100],对于每个优先队列,按第一关键字Fi第二关键字ID排序,每次取出所有的优先队列里最大值,然后直接 计算(Time-1)*Si + Fi 找最大的way,将对应的优先队列pop并输出对应ID即可。#include<cstdio>#include<cstring>#include<queue>#in 阅读全文
posted @ 2012-08-27 20:28 'wind 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 题意: 有N 个人,知道了每个人知道的信息,和它最多能告诉别人的信息数目,问编号为 m 的人最多能知道的信息条数是多少。分析: 由于信息的编号比较大,所以先需要进行离散化。 每个人和自己知道的每个信息之间都有一条边相连, 每个人匹配容量为 他最多能告诉别人的信息数目。#include<stdio.h>#include<string.h>#define maxn 222#define clr(x)memset(x,0,sizeof(x))int cap[maxn]; int map[maxn][maxn];int vlink[maxn]; ... 阅读全文
posted @ 2012-08-26 19:45 'wind 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个序列和 M 个询问,对于每个询问输出询问区间内从右向左第一个出现次数超过 2 的数。分析:预处理用 before[i] 表示第 i 个数之前出现的距离第 i 个数最近求和 第 i 数相等的数的值。 区间查询的时候先查询右儿子区间,再查询能合并的区间,再查询左儿子区间。#include<stdio.h>#include<string.h>#include<map>using namespace std;#define maxn 500005#define max(a,b)(a)>(b)?(a):(b)int va[maxn];int be 阅读全文
posted @ 2012-08-26 19:40 'wind 阅读(277) 评论(2) 推荐(0) 编辑
摘要: 题意: 给出一个地图,要求找出至少经过K条边的最短路,可以走重边。分析:二维最短路,用dis[i][j] 记录 在i 点进过j 条路的最短路 找到dis[i][k]的最小值。SPFA:#include<stdio.h>#include<string.h>#include<queue>#define INF 0x1f1f1f1fusing namespace std;#define maxn 5005struct node{ int to,next,w;}e[200005];int tot;int head[maxn];void add(int s,int u 阅读全文
posted @ 2012-08-26 11:13 'wind 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 题意: 给N个人依次分卡片,然后从的第一个人到最后一个人依次拿走全部的卡片,问最少经过多少次,可以使得卡片回复到原来的次数。分析:求出每个卡片循环到原来位置的最少次数,在一个循环节中,每个卡片的循环次数相同,求出这些循环次数的最小公倍数即可,(输入要用%I64d,用%lld wa了好长时间)#include<stdio.h>#include<string.h>#define maxn 1000long long next[maxn];long long a[maxn];long long gcd(long long x, long long y){ if(!x||!y) 阅读全文
posted @ 2012-08-25 21:58 'wind 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个有N 个节点,和M 条边,这些边分为 蓝色和红色的,问是否存在一种情况为 恰好用 k个蓝色的边,和已有的若干条红色边,将原图连成一棵树。分析: 两次 Kruskal ,第一次的时候先把能用的红色边全部用上,然后用蓝色边,这些用到的蓝色边都是最终的生成树所必需的,将其标记如果发现需要的蓝色边数目大于 K,或用完了能用的蓝色边之后图还未连通,则不存在符合条件的情况 第二次Kruskal的时候,先把之前标记的蓝色边全部用上,然后在剩下的蓝色边选出能用的边,如果总数能达到K则存在符合的情况。#include<stdio.h>#include<string.h># 阅读全文
posted @ 2012-08-25 19:41 'wind 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了汉诺塔的一个状态,求把全部汉诺塔移动到B上的步数。分析: 逆向推即可。#include<stdio.h>#include<string.h>char str[100] ;long long calc(char A, char B, char C, int n){ if(n==0) return 0 ; if(str[n-1]==B) return calc(C,B,A,n-1) ; if(str[n-1]==A) return calc(A,C,B,n-1)+(1LL<<(n-1));}int main (){ ... 阅读全文
posted @ 2012-08-25 19:26 'wind 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 题意: M2%10x=N ,给出n值,找到满足等式的最小m值,x=(0,1,2...)。分析: 由于M的位数不可能超过n的位数,可以从n的最后一位开始逐位搜索。#include<stdio.h>#include<string.h>const __int64 INF=999999999;__int64 num[25];__int64 min(__int64 a,__int64 b){ return a<b?a:b;}__int64 ans,n;int top;__int64 p;void dfs(int pos,__int64 w,__int64 res){ if( 阅读全文
posted @ 2012-08-25 10:54 'wind 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 题意: 给两个数组,求最长公共递增子序列。分析: dp[i,j]表示a串前i个字符,b串前j个字符组成的,并且以b[j]为结尾的最长的LCIS,转移方程: dp[i,j]=dp[i-1,j]; //a[i]与b[j]不等 dp[i,j]=dp[i-1,k]+1; (1<=k<=j-1) //a[i]与b[j] 相等 以上转移方程是O(n^3)时间复杂度 优化: 由于最外层循环是 i,第二层是 j,循环 j 的时候,实际上同时找出dp[i-1,k] 的最大值MAX 方法:循环 j 的同时,若a[i]>b[j],更新MAX (因为当且仅当a[i]>b[j]时,后边循环 j 阅读全文
posted @ 2012-08-25 09:06 'wind 阅读(1354) 评论(0) 推荐(0) 编辑
摘要: 题意: 有N件商品,知道了商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间,求出最大利润。分析:利用并查集按利润排序,建立一个关于时间的并查集 每次插入一个物品时,若该物品时间为 i,找出find(i),记为t,若t不为0,则将该物品安排到t这个时间完成,并使f[t]=t-1 亦即对于每个物品尽量 安排在后边完成,安排后将fa指针前移,表示这个时间已经被占用,下次需要插入到它之前。#include<stdio.h>#include<string.h>#include<algorithm>#define cl 阅读全文
posted @ 2012-08-25 00:02 'wind 阅读(818) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出有n 个节点的网络,和m条单向边,知道了每条边的容量,问哪些边满足增加该边的容量后,能使得从起点到终点的总流量增加(只能修改一条边!)。分析:如果某条边是该关键边,首先满足该边一定能满流,其次要有从 s 到 t 经过该边的可行路径。 先求最大流,找出割边,在正向网络上从 s 开始深搜,将遍历到点用v1[]标记,在反向网络上从 t 深搜,将遍历到的点用v2[]标记, 如果某条边满足 e[i].cap=e[i].flow且v1[e[i].from]=1,e[e[i].to]=1,那么该边即为要求的关键边。#include<stdio.h>#include<string 阅读全文
posted @ 2012-08-24 23:10 'wind 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个人,他们之间的关系有四种,给出一些关系 a,b 表示b 知道 a,现在想把这些人分成两组,每个组里面所有人都相互知道,如果可以分成这两组, 找出两组人数相差最少的情况。分析:如果 a 和 b 不是相互知道,就在a,b之间连一条双向边,表示a 和b 绝不能分在一个组里 建好图之后,进行染色,判断是否是二分图,如果不是二分图,肯定不存在符合条件的情况 染色的同时,记录每个连通块中每个部分的个数,并记录路径 用 01 背包标记所有存在的状态,找到差值最小的情况#include<stdio.h>#include<string.h>#define clr(x)m 阅读全文
posted @ 2012-08-24 19:56 'wind 阅读(1211) 评论(0) 推荐(1) 编辑
摘要: 题意: 给出n 个数,每个数的范围在1..k之间,问最短非子序列的长度是多少。分析:将集合尽可能划分成多个区间,并满足每个区间包含1..k之间所有的数,如果分成了 x 个区间,那么这些区间一定包含了所有长度为 x 的子序列,而没有包含全 部的长度为 x+1 的子序列,因为可以通过在每个区间任取一个数来组成长度为 x 的序列。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int v[10005];int main(){ int n,k,p,i,res,num; while(sca 阅读全文
posted @ 2012-08-24 12:39 'wind 阅读(955) 评论(0) 推荐(0) 编辑
摘要: 题意: 一群伞兵要降落在一个m*n的区域,知道了每个伞兵落入的位置,防守方可以在任意一排或任意一列安装武器,分别可以防御某一排或某一列的敌人,知道了武器放 某一排或某一列的建造费用,找出一种建造方案使得所有武器花费的乘以最小并足以防御任意一个位置的敌人。分析:建图方式:将每一行看成一个点(1..n),将每一列看成一个点(n..n+m)建立一个源点 s = 0, 汇点 t = n+m+1 在 s 和每个行顶点之间连一条容量为行造价的边 在每个列顶点和 t 之间连一条容量为列造价的边 如果(x,y)位置有伞兵,就在 x 行和y列之间连一条容量为无穷大的边 求出最小割即为最小费用,需要注意的地方是要 阅读全文
posted @ 2012-08-23 23:35 'wind 阅读(192) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 17 下一页