摘要: 题目链接这题题目是A simple problem,但这题可谓A的不简单,不知道WA了多少次!题目大意:给定一个数列,求最长的连续子数列,使得最大值与最小值之差不超过给定值。由于数据量比较大,暴力法复杂度为O(N),肯定挂掉。我的做法如下:在扫描的过程中,当发现一段数的最大值与最小值之差大于给定值时,设最小值与最大值下标分别为i,j(无大小关系),下一次扫描时则从MIN(i,j)+1开始,这样可以避免很多不必要的计算。具体实现时要用到单调队列,纠结之处在于把下标移动和队列头指针移动搞混了!这题还有一点需要注意的地方就是最大值减最小值可能溢出。下面的代码提交时需改数据类型。View Code . 阅读全文
posted @ 2012-04-19 20:13 BeatLJ 阅读(421) 评论(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 阅读(214) 评论(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 阅读(288) 评论(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 阅读(332) 评论(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 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 今天早上雨下的特别大,在去比赛的路上鞋和裤腿全湿透了。不过最后拿了第五名(二等奖)也值了。在比赛的过程中,我们队的配合还是很默契的,虽然一上来不在状态,前半个小时一直没提交,而旁边一个队伍神速AC了两题,真是压力山大,不过我们三人都没有慌,相互鼓励,沉着冷静,最终AC了5题,也超过了旁边队伍的4题。现在来看,我们今天的运气不错,在算法导论上找到一个类似算法AC了一题,但也还是有些许遗憾,最终我们排在第五名,而一等奖只取前4名,要是我最后那题能绝杀,今天就完美了。总而言之,这个结果还算不错,跟我们的期望差不多。这次比赛也算是我们组队以来的第一场正式比赛吧,能获奖确实是对我们最大的鼓励,也算是一个 阅读全文
posted @ 2012-04-15 23:35 BeatLJ 阅读(294) 评论(0) 推荐(1) 编辑
摘要: 题目链接题目大意,给定一个整数序列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 阅读(1070) 评论(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 阅读(493) 评论(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 阅读(326) 评论(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 阅读(346) 评论(0) 推荐(0) 编辑