上一页 1 ··· 4 5 6 7 8 9 10 11 下一页
摘要: 题意也就是:一个矩形被n条线段分成n+1份,每条线段各不相交,给出几个点落在矩形内部,问各个部分有几个点。由于各个部分各不相交,线段的上、下端点也就排好序了,然后二分查找每个点落在线段左边的第一条线段,也就找出了落点的区域。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int upLine[5001],lowLine[5001],res[5001],up,low,Left,Right;int IsLeft(int x,int y,int k){ return (u 阅读全文
posted @ 2012-02-26 19:41 书山有路,学海无涯 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 纯属模拟,但关键分为三种情况:最大的(没有排好的)元素在最底下、在最上面、在其他位置。第一种情况:不需要排,因为已经在该在的位置。第二种情况:需要一步,从它应该在的位置翻转一下。第三种情况:需要两步,先把它翻转到最上面去,然后再从它应该在的位置翻转一次。翻转操作我用栈和队列来回倒换。#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<stack>#include<algorithm>using namespace std;#d 阅读全文
posted @ 2012-02-24 13:58 书山有路,学海无涯 阅读(434) 评论(0) 推荐(0) 编辑
摘要: 一道较难的贪心题,看了看大牛的博客才渐渐有了思路:贪心原则应该是Ci大的尽量先染色,但是由于父节点染了才能染子节点的限制使得问题不好解决了,但是Ci大的一定是在其父节点染色后立即被染色,这时大牛们的思路我也没有看明白如何证明的,但仔细一想就明白了。于是我们根据这个条件就可以将Ci大的点与其父节点合并在一起组成一个集合。这样就可以将问题规模减小。 合并后的点(即集合)的属性如何变化呢?假如设fact[i]表示集合的Ci和,iNum[i]表示i所属集合的结点个数;那么把fact[i]/iNum[i]作为贪心原则,其值大者先合并到其父节点,最终合并成一个集合。答案是怎么得出来的我看了很长时间才明白。 阅读全文
posted @ 2012-02-19 21:27 书山有路,学海无涯 阅读(2321) 评论(0) 推荐(0) 编辑
摘要: 一道简单的匹配问题,行列匹配,根据题意若行大于列匹配不成功,若列大于行,大于行的部分可随意。代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int map[1001][2],col[1001],match[1001],visit[1001];int dfs(int i){ int j,k; for(j=0;j<2;j++) { k=map[i][j]; if(!visit[k]) { visit[k]=1; ... 阅读全文
posted @ 2012-02-18 16:52 书山有路,学海无涯 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 一道简单的树形DP,可以这么想:每个节点有可能选择也有可能不选择,而且各个子树相互独立,我用DP[i][0]表示节点i不选择所需要的最少士兵,DP[i][1]表示i节点选择所需要的最少士兵。假如j是i的儿子,因此状态转移方程可以写成如下形式:DP[i][0]+=DP[j][1] ;DP[i][1]+=min(DP[j][0],DP[j][1]);#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{ int i,next;}S[15001];int 阅读全文
posted @ 2012-02-18 13:59 书山有路,学海无涯 阅读(265) 评论(0) 推荐(0) 编辑
摘要: #include<iostream>#include<cstdio>#include<cstring>using namespace std;bool flag=false;int kk;char GetNext() //将没用的符号过滤掉{ char c; while(scanf("%c",&c) && (c==' ' || c=='\n' || c==9 || c==10)); return c;}int dfs(int sum,int hight){ int sign=1,k= 阅读全文
posted @ 2012-01-01 22:02 书山有路,学海无涯 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 所谓关节点就是在一个连通图中删除某个顶点及其附属的边,原图变为非连通图。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由深度优先生成树可得出两类关节点的特性: (1)若生成树的根有两棵或两棵以上的子树,则此根顶点必为关节点。因为图中不存在连接不同子树顶点的边,若删除此节点,则树便成为森林。 (2)若生成树中某个非叶子节点V,其某棵子树与V的祖先节点无连接,则V为关节点。因为删去v,则其子树和图的其它部分被分割开来用图说明一下吧:如上图所示,很显然去掉A或C后整个图就变成不联通了,因此A、C就是关节点。怎么用代码实现找出关节点呢?其实我们可以严格按照... 阅读全文
posted @ 2011-12-17 22:10 书山有路,学海无涯 阅读(7963) 评论(1) 推荐(1) 编辑
摘要: 题意也就是找一个网络中的关节点(割点)个数。#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{ int i; int next;};int head[101],pre[101],low[101],ss[101],N,count,cnt;node edge[10001];int dfs(int i,int root){ int j,w,k=0; if(pre[i]==0) pre[i]=low[i]=++cnt; for(j=head[i];j; 阅读全文
posted @ 2011-12-17 19:28 书山有路,学海无涯 阅读(363) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一些树的位置,价值,长度,现要求先砍一些树制成一定长度的篱笆将剩余的树围起来,求要砍树的最小总价值。因为树的个数最多为15个很容易想到用二进制数表示树的状态进行遍历。#include<iostream>#include<cstdio>#include<cmath>using namespace std;#define MAX_INT 123456789#define esp 10e-8struct point { int x,y;};point vertex[16];int res[16],Choice[16],noChoice[16],minLe 阅读全文
posted @ 2011-11-13 18:50 书山有路,学海无涯 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 题目大意就是最大点对距,最大点对距的两端点一定是凸包顶点,所以找出形成凸包所需要的最少顶点,然后遍历找出最大点对距。对凸包算法的详细讲解:http://www.cnblogs.com/Booble/archive/2011/03/10/1980089.html#include<iostream>#include<cstdio>using namespace std;struct point{ int x,y;};point vertex[500000],res[500000];int cmp(const void * a,const void* b){ point p1 阅读全文
posted @ 2011-11-12 20:20 书山有路,学海无涯 阅读(238) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 下一页