摘要: 题目链接题目大意,给定一个整数序列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) 编辑
摘要: 题目链接题目大意:给出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 阅读(196) 评论(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 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 题目链接题目大意,给定一个整数表达式A1/A2/A3/.../An,('/'为除号1<=n<=10000,1<=Ai<=1000000000),问是否能通过添加括号使得表达式的值为整数。咋一看似乎没思路,但仔细想,不难发现这里存在最优策略,最优策略是用一个括号将表达式变成A1/(A2/A3/.../An)。证明如下:n为1时,直接输出"YES",n大于1时,首先,A2一定为分母,无论如何添加括号都无法改变这个事实,其次,按照上面的策略加括号后,只有A2为分母,所以这是个最优策略。有了最优策略后,我们需要做的就是不断约分(求最大公约数) 阅读全文
posted @ 2012-04-13 09:51 BeatLJ 阅读(195) 评论(0) 推荐(0) 编辑