随笔分类 -  ACM题解

上一页 1 ··· 5 6 7 8 9 10 11 下一页
摘要:题目链接最短路的题,与一般的最短路不同的是,建图后每个结点有一个等级值(一个非负整数),要求最短路并且路线上的结点的最大等级差不超过给定值。这题一开始我想到的就是枚举等级区间,在对应区间内用dijkstra求最短路,复杂度是L*N2,L是给定的最大等级差,N为结点数,由于题中L的最大值没有给出,所以我担心会超时,写好后提交是WA而不是TLE,这也让我确定了此法的可行性。经检查发现导致WA的错误:1.建图错误,按题意应建有限图;2.有一个两重循环的下标重复了;3.松弛的时候忘了检查结点等级。View Code 1 #include <stdio.h> 2 #include <s 阅读全文
posted @ 2012-04-22 13:40 BeatLJ 阅读(259) 评论(0) 推荐(0)
摘要:题目链接并查集的题,食物链模型。题目大意:已知关于n个数的m条信息,信息有两类,一类是已知Ai比Aj大K,另一类是已知Ai为K,问是否能从这m条信息中唯一确定这n个数,或者能推出矛盾。View Code 1 #include <stdio.h> 2 #define N 10001 3 #define M 20001 4 int p[N],c[N],v[N]; 5 int a[M],b[M],cnt; 6 char vis[N]; 7 int n,m; 8 void make_set() 9 {10 int i;11 for(i=0;i<n;i++) p[i]=i,c[i... 阅读全文
posted @ 2012-04-22 10:09 BeatLJ 阅读(335) 评论(0) 推荐(0)
摘要:题目链接枚举题。第一次WA可能是因为读数据时用了getchar()吸收回车。View Code 1 #include <stdio.h> 2 #define N 1005 3 char map[N][N]; 4 int n,m; 5 char equal(char a,char b,char c) 6 { 7 return (a==b&&b==c); 8 } 9 char is_combo()10 {11 int i,j;12 for(i=0;i<n;i++)13 {14 for(j=0;j+2<m;j++) if(equal(map[i][... 阅读全文
posted @ 2012-04-21 14:53 BeatLJ 阅读(263) 评论(0) 推荐(0)
摘要:题目链接求单源最短路的题,因为边权非负,所以可以用dijkstra。这题有一点需要注意的地方是有重边,在读数据时取较小的即可。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define N 200 5 #define INF 2000000 6 int g[N][N]; 7 int dist[N]; 8 int n,m; 9 char vis[N];10 void dijkstra(int u)11 {12 int i,min 阅读全文
posted @ 2012-04-20 23:06 BeatLJ 阅读(226) 评论(0) 推荐(0)
摘要:题目链接这题与HDOJ1879有点不太一样,不能把不符合条件的边看成是已经修好的,使用克鲁斯卡尔时,碰到不符合的边直接跳过即可。View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #define D(x1,y1,x2,y2) (sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))) 5 #define N 101 6 #define M 5000 7 int x[N],y[N]; 8 struct node 9 {10 int a,b;11 阅读全文
posted @ 2012-04-20 22:21 BeatLJ 阅读(224) 评论(0) 推荐(0)
摘要:题目链接最小生成树的题。克鲁斯卡尔算法。View Code 1 #include <stdio.h> 2 #define N 100 3 #define M 5000 4 struct node 5 { 6 int a,b,d; 7 }edge[M]; 8 int n; 9 int p[N];10 void make_set()11 {12 int i;13 for(i=1;i<=n;i++) p[i]=i;14 }15 int find_set(int i)16 {17 return i==p[i]?p[i]:(p[i]=find_set(p[i]));... 阅读全文
posted @ 2012-04-20 21:23 BeatLJ 阅读(213) 评论(0) 推荐(0)
摘要:题目链接最小生成树的题。我用的克鲁斯卡尔算法。View Code 1 #include <stdio.h> 2 #define N 100 3 #define M 5000 4 struct node 5 { 6 int a,b,d; 7 }edge[M]; 8 int n,m; 9 int p[N];10 void make_set()11 {12 int i;13 for(i=1;i<=n;i++) p[i]=i;14 }15 int find_set(int i)16 {17 return i==p[i]?p[i]:(p[i]=find_set(p[... 阅读全文
posted @ 2012-04-20 21:07 BeatLJ 阅读(236) 评论(0) 推荐(0)
摘要:题目链接题目大意:给定n个整数,接下来有m个操作,操作分为两类,一类是修改操作:将第i个数改为k,另一类是查询操作:询问i,j之间第k大的数是多少。对于每个查询操作输出结果。如果没有修改操作,可以直接用伴随数组来做。跟POJ2104那题一样。这里的关键是修改操作,如果每次修改后都进行排序的话,肯定挂掉,注意到我们这里每次只修改一个数,只需将修改的数排到正确的位置即可,可以使用链表实现。这题的纠结之处在于数据格式,读入处理不好可能会WA或者RE。View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 阅读全文
posted @ 2012-04-20 20:44 BeatLJ 阅读(289) 评论(0) 推荐(0)
摘要:题目链接动态规划或者记忆化深搜。View Code 1 #include <stdio.h> 2 #define N 1005 3 char a[N],b[N],c[N][N]; 4 int n; 5 char dfs(int left,int right) 6 { 7 int k=right-left+1; 8 char f1=0,f2=0; 9 if(left==0&&right==n-1) return 1;10 if(c[left][right]!=-1) return c[left][right];11 if(left>0&&b[k] 阅读全文
posted @ 2012-04-19 22:46 BeatLJ 阅读(219) 评论(0) 推荐(0)
摘要:题目链接这题题目是A simple problem,但这题可谓A的不简单,不知道WA了多少次!题目大意:给定一个数列,求最长的连续子数列,使得最大值与最小值之差不超过给定值。由于数据量比较大,暴力法复杂度为O(N),肯定挂掉。我的做法如下:在扫描的过程中,当发现一段数的最大值与最小值之差大于给定值时,设最小值与最大值下标分别为i,j(无大小关系),下一次扫描时则从MIN(i,j)+1开始,这样可以避免很多不必要的计算。具体实现时要用到单调队列,纠结之处在于把下标移动和队列头指针移动搞混了!这题还有一点需要注意的地方就是最大值减最小值可能溢出。下面的代码提交时需改数据类型。View Code . 阅读全文
posted @ 2012-04-19 20:13 BeatLJ 阅读(431) 评论(0) 推荐(0)
摘要:题目链接题目大意:给定3个已排序的数列,在每个数列中选一个数,记为x,y,x,使(x-y)2+(y-z)2+(z-x)2最小。具体解法是贪心。这题我无语了,就因为打错一个字母,WA了4次。还好在队友帮助下及时发现,否则还不知道要纠结多久……下面的代码提交时需改数据类型,防止溢出。View Code 1 #include <stdio.h> 2 #define MIN(a,b) ((a)<(b)?(a):(b)) 3 #define N 1000005 4 int a[N],b[N],c[N]; 5 int dist(int x,int y,int z) 6 { 7 retur 阅读全文
posted @ 2012-04-18 09:53 BeatLJ 阅读(225) 评论(0) 推荐(0)
摘要:题目链接单调队列练习题。题目大意:n个牛排成一列向右看,牛i能看到牛j的头顶,当且仅当牛j在牛i的右边并且牛i与牛j之间的所有牛均比牛i矮。设牛i能看到的牛数为Ci,求∑CiView Code 1 #include <stdio.h> 2 #define N 8000001 3 #define INF 0x7fffffff 4 int a[N]; 5 int q[N],front,rear; 6 int main() 7 { 8 int i,n; 9 long long ans;10 while(~scanf("%d",&n))11 {12 f... 阅读全文
posted @ 2012-04-18 09:47 BeatLJ 阅读(294) 评论(0) 推荐(0)
摘要:题目链接求逆序数的题。因为只有4种元素,所以可以直接统计排在某个元素前面且比它小的元素个数(用4个变量记录已出现的A,C,G,T的个数),复杂度为O(N)。若元素种类很多,可以使用树状数组进行类似基数排序的统计。View Code 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 55 4 #define M 105 5 struct node 6 { 7 char s[N]; 8 int d; 9 }node[M];10 int a,c,g,t,len;11 int cal(char s[])12 {13 . 阅读全文
posted @ 2012-04-18 08:56 BeatLJ 阅读(345) 评论(0) 推荐(0)
摘要:题目链接经典单调队列题。View Code 1 #include <stdio.h> 2 #define N 1000005 3 int a[N]; 4 int q[N],front,rear; 5 int main() 6 { 7 int i,n,k; 8 while(~scanf("%d%d",&n,&k)) 9 {10 for(i=0;i<n;i++) scanf("%d",&a[i]);11 front=rear=0;12 for(i=0;i<n;i++)13 {14 ... 阅读全文
posted @ 2012-04-17 20:04 BeatLJ 阅读(195) 评论(0) 推荐(0)
摘要:题目链接题目大意,给定一个整数序列a[N],询问区间ai到aj之间第k大的数是多少。共m次询问,对每次询问输出结果。此题可用伴随数组处理。具体做法是在输入的时候用一个数组保存每个数的序号,我们称这个数组为伴随数组,输入完成后,对数组进行排序,但对应的序号不变(用结构体将该数及其序号绑定,然后对结构体排序)。上面这个过程可以看成是预处理,接下来,对于每个询问i,j,k,只需对排序后的数组扫描一次即可,碰到序号在i到j之间的就--k,直到k为0,此时对应的数即为所求。View Code 1 #include <stdio.h> 2 #define N 100000 3 struct n 阅读全文
posted @ 2012-04-13 23:16 BeatLJ 阅读(1076) 评论(0) 推荐(0)
摘要:题目大意,给定圆心在原点的一个圆内的2*n个整点,求由AX+BY=0(A,B均为-500到500的整数)确定的一条直线,使得直线两边的点一样多,点不允许在直线上。由于题中数据均为有限的小整数,且时限不严,所以直接枚举即可。View Code 1 #include <stdio.h> 2 #define N 100 3 int x[N],y[N]; 4 int main() 5 { 6 int i,n,a,b,cnt,ok; 7 while(scanf("%d",&n)&&n) 8 { 9 for(i=0;i<2*n;i++) sca 阅读全文
posted @ 2012-04-13 21:15 BeatLJ 阅读(502) 评论(0) 推荐(0)
摘要:题目链接题目大意:给定一个整数序列,求最长上升子序列的长度,并求最长上升子序列的个数。关键在于求个数,可以另设数组c[k]保存以a[k]结尾的最长子序列的个数。View Code 1 #include <stdio.h> 2 #define MAX(a,b) ((a)>(b)?(a):(b)) 3 #define N 1000 4 int h[N],f[N],c[N],n; 5 int main() 6 { 7 int i,j,ans,cnt; 8 while(~scanf("%d",&n)) 9 {10 for(i=0;i<n;i++) s 阅读全文
posted @ 2012-04-13 15:35 BeatLJ 阅读(338) 评论(0) 推荐(1)
摘要:题目链接题目大意:棋盘上有一个马和一个帅,现给定棋盘的大小及马和帅的位置,假定帅不能移动,求马最少在多少步之内能吃到帅。这题我WA了4次,第一个错误是没有考虑到帅可能会阻挡马的路线,第二个错误是初始化t[N][N]时不小心将两个循环中都写成了n,而棋盘的大小是n*m。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define INF 0x7fffff 5 #define N 20 6 #define M 401 7 struc 阅读全文
posted @ 2012-04-13 14:13 BeatLJ 阅读(353) 评论(0) 推荐(0)
摘要:题目链接题目大意:给出n个公寓的互相距离,选择在其中一个公寓楼下建食堂,要求食堂到最远的公寓的距离最短。使用floyd求最短路,最短距离存在dist[N][N]中,然后求每行的最大值,再在这些最大值中求最小值。View Code 1 #include <stdio.h> 2 #define MAX(a,b) ((a)>(b)?(a):(b)) 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define INF 0x7ffffff 5 #define N 100 6 int dist[N][N]; 7 int main() 8 { 9 i 阅读全文
posted @ 2012-04-13 10:30 BeatLJ 阅读(203) 评论(0) 推荐(0)
摘要:题目链接经典贪心算法题。题目大意,给定一个整数N(位数最多2000)和整数k,在N中删除k个数使得剩下的数组成的整数最小。需要注意的是结果不要输出前导0。贪心策略为:从高位到低位扫描,若存在递减区间,则将高位删除以消除递减区间,否则从低位删。具体操作时,可以设一个栈来保存从高位起还没删的数。不难发现最后的结果一定是一个不下降序列,由此可以想到用二分来优化。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define MIN(a,b) ((a)<(b)?(a):(b)) 4 #define N 2005 阅读全文
posted @ 2012-04-13 10:07 BeatLJ 阅读(387) 评论(0) 推荐(0)

上一页 1 ··· 5 6 7 8 9 10 11 下一页