摘要: 题意:有n个正整数组成一个序列,给定整数S,求长度最短的连续序列,使得他们的和大于等于S分析:设输入的序列为A[i], i=1..n, 构造前缀数组B[j], j=1..n, B[j]=B[j-1]+A[j], 规定B[0]=0, 当B[j]-B[i-1]>=s的时候i增加,直至B[j]-B[i]<s, 然后更新最短的满足条件的序列的长度j-i+1,复杂度为O(n)代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 #define DEBUG 5 c 阅读全文
posted @ 2013-02-11 17:59 ChrisZZ 阅读(941) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一个矩形照相机,还有n个流星的初始位置和速度,求能找到流星最多的时刻,注意,在相机边界上的点不会被照到。分析:相机的边界是固定的,只需要判断每一颗流星是否在照相机的区域内出现过,如果出现过,记录其出现的时间区间[ai,bi],那么问题转化为求一个时间t使得此时有最多的区间经过这个点,类似于“扫描线”View Code 1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 #define DEBUG 5 double max(double a, double b){ 6 retu 阅读全文
posted @ 2013-02-11 17:11 ChrisZZ 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 题意:有一个老式计算器,只能保存最多n位数,如果结果超出n位,则保留前n位。现在输入一个n和一个k,k表示一个数字,然后不停的求k的平方并令k=k*k,发现会出现循环的结果,求所有结果种最大的一个。分析:暴力模拟可以过的,但有更好的算法。暴力:用哈希、set都可以。高效算法:Floyd判圈算法,假设两个小孩在有环形的跑道上跑,一个速度为v,另一个速度为2*v,出发点相同,那么总会有相遇的时候,相遇的时候就是跑完一圈了,那么最大值一定跑过了~代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 #define 阅读全文
posted @ 2013-02-11 15:53 ChrisZZ 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 题意:给定n个整数,求Ai-Aj的最大值(i<j), 2<=n<=100000分析:简单模拟的话,用二重循环,O(n2)的复杂度肯定不行。对于每个Aj,只需要Ai最大就行,而最大的Ai可以通过相邻元素的比较获得,那么接下来枚举Aj即可,转化成O(n)代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 #define DEBUG 4 using namespace std; 5 const int MAXN = 10000 + 10; 6 int a[MAXN]; 7 int main(){ 阅读全文
posted @ 2013-02-11 11:54 ChrisZZ 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 题意:题目说输入一些年龄,在1-100之间,然后把它们排序后输出。但是限制条件是输入文件约25MB,内存限制是2MB,不能全都读入后再排序。分析:数字比较小,可以用计数排序,即用一个数组保存每个年龄出现的个数即可。View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #define DEBUG 5 using namespace std; 6 int main(){ 7 #ifndef DEBUG 8 freopen("in.txt", & 阅读全文
posted @ 2013-02-11 11:02 ChrisZZ 阅读(148) 评论(0) 推荐(0) 编辑