摘要:
题意:给定n个大写字母组成的字符串,选择尽量多的串,使得每个大写字母都能出现偶数次。分析:暴力枚举O(2n)不行。 采用密码学中的中途相遇攻击原理,用stl的map实现:先取得前一半的判断结果然后后一般在前一半的基础上判断代码:View Code 1 #pragma warning(disable:4786) 2 #include <stdio.h> 3 #include <map> 4 #define DEBUG 5 using namespace std; 6 7 const int MAXN = 24; 8 map<int , int>table; 9 阅读全文
摘要:
题意:给出一个三维的由单位立方体组成的长方体,每个单位立方体有一个值,求这个大的长方体的一个子长方体,使得构成它的单位立方体对应的值之和最大。分析:这是经典问题从一维延伸到三维的情况。画图后就能解决~构造前缀和a[i][j][k]表示以它为右下角的立方体和,然后枚举,复杂度O(n6),这道题目肯定能过。代码:View Code 1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 long long a[21][21][21]; 5 int main(){ 6 int cas, line 阅读全文
摘要:
题意:给出平面上的n个点,找一个矩形,使得边界上包含尽量多的点。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 #define DEBUG 5 using namespace std; 6 struct ZZ{ 7 int x, y; 8 bool operator < (const ZZ& p) const{ 9 return x<p.x;10 }11 };12 int max(int a, int b){13 return 阅读全文
摘要:
题意:斐波那契素数的概念:任取斐波那契数列中的某一项Fi,对于所有小于Fi的斐波那契数,如果Fi都和它互为质数,那么Fi是斐波那契素数。输入n,输出第n个斐波那契素数。分析:黑书上有这题的详细分析,大意是说从第5项开始下标为素数的斐波那契数一定是斐波那契素数。代码:View Code 1 #include <stdio.h> 2 #include <string.h> 3 const int MAXN = 250010;; 4 int prime[25010]; 5 bool isprime[MAXN]; 6 long double fib[MAXN]; 7 int m 阅读全文
摘要:
题意:给出一个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 阅读全文
摘要:
题意:给定一个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 阅读全文