摘要: 题意:给出一个a*b的网格,在网格上取不共线的三点构成三角形,求三角形总数。分析:就是一一道简单的组合数计算题目,设总结点数为n,则取三个节点的个数为C(n,3),然后减去横向、竖向、斜向的三点共线的个数即可,斜线三点共线等价于所枚举的矩形的长宽成倍数关系,即gcd不为1代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 using namespace std; 4 long long gcd(long long a, long long b){ 5 if(a%b==0) return b; 6 retur 阅读全文
posted @ 2013-02-12 11:41 ChrisZZ 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个m*n的矩阵,其中一些个字是空地(F),其他是障碍(R)。找出一个全部由F组成的面积最大的矩阵,输出其面积的3倍。分析:简单暴力枚举,O(m3*n3),肯定不行。对于某一块F,设up[i][j]表示其上方的空地个数(就像一条悬线),zl[i][j]表示悬线能往左边走到的边界线的坐标,zr[i][j]表示悬线能往右边走到的边界的坐标,那么面积s=(zr[i][j]-zl[i][j]+1)*up[i][j], zl从左到右枚举可以算出,zr则是从右到左枚举,状态转移是:zl[i][j]=max(zl[i-1][j], lo+1), lo表示第i行中第j列左边的最近障碍物的列编号, z 阅读全文
posted @ 2013-02-12 11:28 ChrisZZ 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 题意:有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 阅读(934) 评论(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) 编辑
摘要: 题意:有n个人围城一个圈,其中第i个人想要ri个不同的礼物,相邻的两个人可以聊天,炫耀自己的礼物,如果两个相邻的人拥有同一种礼物,则双方都会很不高兴。问:医用需要多少种礼物才能满足所有人的需要?假设每种礼物有无穷多个,不相邻的两个人不会一起聊天。分析:《训练指南》上的分析我没看懂,但是我觉得书上讲的麻烦了。当输入完每个人的ri后,统计相邻两个人的ri之和的最大值Max,如果这个Max比应当提供给所有人礼物数的均值的两倍还要少,那么ans=均值的两倍,否则ans=Max,代码写起来也很短:View Code 1 #include <stdio.h> 2 #include <io 阅读全文
posted @ 2013-02-10 21:00 ChrisZZ 阅读(196) 评论(1) 推荐(0) 编辑
摘要: 题意:有f+1个人来分N个圆形派,每个人能得到的必须是一整块派,而不是几块拼在一起,且面积要相同,求每个人最多能得到多大面积的派分析:对于每个人分到的派的大小,其上界是面积最大的派,下界可以取得0,在两者之间用二分的方法做就可以了,二分的判定是,给定一个面积x,每个派能分成[pi*r*r/x]份,看这个结果是否大于f+1代码 1 #include <stdio.h> 2 #include <iostream> 3 #include <math.h> 4 #include <algorithm> 5 #define zz 6 using names 阅读全文
posted @ 2013-02-10 18:04 ChrisZZ 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 题意:你有b元钱,想要组装一台电脑,给出n个配件的各自的种类、品质因子和价格,要求每种类型的派件各买一个,总价格不超过b,且“品质最差配件”的品质因子应该尽量大 (题目保证有解),输出配件最小品质因子的最大值分析:既然题目保证有解,那么每种配件都选品质最差的是一个极端,每种都选品质最好有是一个极端,在两个极端之间二分就可以得到答案。 1 #pragma warning(disable:4786) 2 #include <stdio.h> 3 #include <iostream> 4 #include <string> 5 #include <vect 阅读全文
posted @ 2013-02-10 17:15 ChrisZZ 阅读(246) 评论(0) 推荐(0) 编辑