摘要: 题目链接题目的模型为给定含m个数的数列,将其分为连续的n段,使每段的和的最大值最小(刘汝佳白书上有)。由于是连续的,题目就简单了,之前就是没注意到这点,想了好久都没思路。我们可以首先可以确定结果的上界和下界,然后使用二分法将这个区间不断缩小,这个过程中要判断对于一个给定的x,是否能够在x天内修完路,因为路段是连续的,所以可以使用贪心来判断,贪心策略为,从第一个数开始,将尽量多的数分配到第一段,以此类推,直至分配完成,若分配的段数大于n则无法在x天内完成,否则可以。 1 #include <stdio.h> 2 #define MAX(a,b) ((a)>(b)?(a):(b) 阅读全文
posted @ 2012-04-07 19:49 BeatLJ 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 题目链接经典DP问题。由于最初if(c[i][j]>=0) return c[i][j];一句中少写一个等于号造成TLE,查了好久啊……View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MAX(a,b) ((a)>(b)?(a):(b)) 4 #define N 300 5 char a[N],b[N]; 6 int c[N][N]; 7 int f(int i,int j) 8 { 9 if(i<0 || j<0) return 0;10 if(c[i][j]>= 阅读全文
posted @ 2012-04-06 21:33 BeatLJ 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 题目链接简单DP题。View Code 1 #include <stdio.h> 2 #define N 45 3 int c[N][2]; 4 int main() 5 { 6 int t,i,n; 7 c[1][0]=c[1][1]=1; 8 for(i=2;i<N;i++) 9 {10 c[i][0]=c[i-1][0]+c[i-1][1];11 c[i][1]=c[i-1][0];12 }13 scanf("%d",&t);14 for(i=1;i<=t;i++)15 {16 ... 阅读全文
posted @ 2012-04-06 17:39 BeatLJ 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题目链接简单动态规划题。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define N 500002 4 #define MAX 10000000 5 char vis[MAX]; 6 int c[N]; 7 int main() 8 { 9 int n,i,tmp; 10 c[0]=0,vis[0]=1; 11 for(i=1; i<N; i++) 12 { 13 tmp=c[i-1]-i; 14 if(tmp>0&&!vis[tmp]) vis[tmp]=1,c[i]=tm 阅读全文
posted @ 2012-04-06 17:22 BeatLJ 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 题目链接简单的动态规划题,WA了4次居然是因为N太小,为自己的吝啬感到无语。View Code 1 #include <stdio.h> 2 #define N 21 3 int f[N][N][N]; 4 int w(int a,int b,int c) 5 { 6 if(a<=0 || b<=0 || c<=0) return 1; 7 if(a>20 || b>20 || c>20) return w(20,20,20); 8 if(f[a][b][c]>0) return f[a][b][c]; 9 if(a<b&&a 阅读全文
posted @ 2012-04-06 17:02 BeatLJ 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 题目链接经典的动态规划题(数塔)。View Code 1 #include <stdio.h> 2 #define MAX(a,b) ((a)>(b)?(a):(b)) 3 #define N 100 4 int a[N][N],f[N]; 5 int main() 6 { 7 int n,i,j; 8 while(scanf("%d",&n)!=EOF) 9 {10 for(i=0;i<n-1;i++)11 {12 for(j=0;j<i+1;j++) scanf("%d",&a[i][j]);13 ... 阅读全文
posted @ 2012-04-06 16:11 BeatLJ 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 题目链接此题初看起来是一个二分匹配的问题,一个国王有n个儿子,将要与n个女孩结婚,已知每个儿子喜欢某几个女孩,并给出了一个初始匹配,问题是求每个儿子可能与哪些他喜欢的女孩结婚,一旦他选一个结婚后,其他的儿子仍能选到自己喜欢的人结婚。若直接枚举个中可能,然后用匈牙利算法求完美匹配判断,这样的话时间复杂度是O(n5),毫无疑问会超时。在这里,题目给出里一个初始完美匹配,必须加以利用。我们可以把初始完美匹配中的每一对看成结点进行构图,因此每个结点包含一个男孩和一个女孩,若结点i中的男孩喜欢结点j中的女孩,就在结点i与结点j之间连一条有向边,这样问题就转化为求强分图,每个男孩可以与他喜欢的并且与他在同 阅读全文
posted @ 2012-04-04 22:12 BeatLJ 阅读(748) 评论(0) 推荐(0) 编辑
摘要: 题目链接动态规划题。模型为给定一条直线上的n个整点坐标,在其中选取p个点作为警亭,使得其余的点到最近的警亭的距离之和最小(下面简称最小距离和)。对输入坐标排序后,用c[i][j]保存最后一个警亭设在第i点,且该点之前还有j个警亭的情况下,第一点到第i点的最小距离和。照此不难写出状态转移方程。c[i][j]=max{c[k][j-1]+(min(d[i]-d[t],d[t]-d[k]),t=k+1...i-1),k=j-1...i-1}View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <s 阅读全文
posted @ 2012-04-04 17:56 BeatLJ 阅读(1218) 评论(0) 推荐(0) 编辑
摘要: POJ3177POJ3352把这两个题写到一起,是因为这两题完全一样,用下面的代码两个题都可以AC。题目大意是给一个无向连通图,求添加最少边数使原图变成双连通图。由于是第一次写双连通图的缩点,所以WA了5次,在WA到AC的过程中,发现的错误如下:1、深度优先数没有初始化;2、深度优先数初始化错误;3、桥的判断有误;4、输入数据有重边,使用邻接表存储没有跳过重边。下面写一下这题的主要思路,用数组dfn保存各个结点的访问顺序(深度优先数),数组low[k]保存结点k及其子结点通过回边能到达的所有结点的最小深度优先数(下面简称最小深度优先数)。若子节点的最小深度优先数大于父结点的最小深度优先数,则连 阅读全文
posted @ 2012-04-04 17:50 BeatLJ 阅读(462) 评论(0) 推荐(0) 编辑
摘要: 题目链接简单的搜索题,深搜即可。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MAX(a,b) ((a)>(b)?(a):(b)) 4 #define CLR(a) (memset(a,0,sizeof(a))) 5 #define N 101 6 char g[N][N]; 7 int n,m,k,ans,tmp; 8 int dir[4][2]={1,0,0,1,-1,0,0,-1}; 9 void dfs(int i,int j)10 {11 int d,ni,nj;12 g[i 阅读全文
posted @ 2012-04-03 23:04 BeatLJ 阅读(231) 评论(0) 推荐(0) 编辑