摘要: 时间限制:3000ms | 内存限制:65535KB难度:4描述求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4输入第一行一个整数0随后的n行,每行有一个字符串,该字符串的长度不会超过10000输出输出字符串的最长递增子序列的长度样例输入3 aaa ababc abklmncdefg样例输出1 3 7题目很经典,学习一下吧。#include #include #include using namespace std;const int MAXN = 10000 + 5;int main(){ int n; scanf("%d", &am 阅读全文
posted @ 2013-02-08 20:31 ChrisZZ 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 最长公共子序列时间限制:3000ms | 内存限制:65535KB难度:3描述咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。输入第一行给出一个整数N(0接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.输出每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。样例输入2 a 阅读全文
posted @ 2013-02-08 20:29 ChrisZZ 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个圆弧边矩形,长a宽b,周长为400,且两边的圆弧同属一个圆。给出长宽比m:n,求长和宽策略:列方程求解。令k=n/m,则解出a = 200 / (1 + atan(k)*sqrt(1+k*k));代码:#include #include using namespace std;int main(){// freopen("in.txt", "r", stdin); int m, n; int id = 1; while(scanf("%d : %d", &m, &n)!=EOF){ double k = 阅读全文
posted @ 2013-02-08 20:28 ChrisZZ 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 题目:In the picture below you can see a triangle ABC. Point D, E and F divides the sides BC, CA and AB into ratio 1:2 respectively. That is CD=2BD, AE=2CE and BF=2AF. A, D; B, E and C, F are connected. AD and BE intersects at P, BE and CF intersects at Q and CF and AD intersects at R.So now a new tria 阅读全文
posted @ 2013-02-08 20:26 ChrisZZ 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 题意:给定N与K(均为正整数)可以确定第K个全排列(1..N的全排列),但N较大,现以N=sigma(Si×(K-i)!)(i=1..K)的形式,输入K以及Si,i=1..K,请输出第K个全排列分析:逆向去想,对于一个给定的全排列可以确定它的序号K,K的表达式形式与N类似,发现从Si可以确定第K个全排列中的第i项,具体用线段树实现查找第i项即可。代码:#include #include using namespace std;struct segment{ int l, r, k;}p[200000];void build(int i, int l, int r){ p[i].l . 阅读全文
posted @ 2013-02-08 20:24 ChrisZZ 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 题意:给出若干矩形的长和宽,小的矩形可以嵌套在大的矩形中,求矩形最多的嵌套中矩形的个数做法:嵌套关系是二元关系,转化为DAG上的最长路径问题,使用邻接表+状态转移方程即可,经典递归思想。代码://nyoj 16#include#include#includeusing namespace std;const int maxn = 150;int graph[maxn][maxn];int d[maxn], n, a[maxn], b[maxn];int max(int a, int b){ return a>b?a:b;}int dp(int i){ if(d[i]>0) retu 阅读全文
posted @ 2013-02-08 20:24 ChrisZZ 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个周长为10000的圆上等距分布着n个雕塑,现在又有m个新雕塑加入,位置可以随意放,希望所有的n+m个雕塑在圆周上均匀分布,这就需要移动其中一些原有的雕塑,要求n个雕塑移动的总距离最小,输出这个最小值分析:把点转化为相对坐标,先缩小n倍再放大n+m倍,得到新坐标pos,并取离pos最近的整点,两者之差的绝对值再缩小n+m倍就是需要移动的距离,所有的点的移动距离累加即可。floor(pos+0.5)表示距离pos最近的整数点代码:#include #include #include using namespace std;int main(){ int n, m; whil... 阅读全文
posted @ 2013-02-08 20:22 ChrisZZ 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 分金币题意:圆桌上有n个人,每人有若干金币,金币总和能整除n,每个人可以分给他相邻两个人若干金币,现在需要使每个人最终金币数量相同,求需要转移的金币数量总和的最小值。类型:单变量极值->中位数问题代码#include #include using namespace std;const int maxn = 1000000 + 10;long long a[maxn], c[maxn], tot, m;int main(){ int n; while(scanf("%d", &n)!=EOF){ tot = 0; int i, j; for... 阅读全文
posted @ 2013-02-08 20:21 ChrisZZ 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 题意:有n个人需要你分配任务,交代任务需要bi时间,执行任务需要ji时间,要求最早完成任务,请输出最后完成对的工作的时间。类型:贪心(先排序再处理)代码:#include#include#include#includeusing namespace std;int max(int a, int b){ return a>b?a:b;}struct job{ int j, b; bool operator x.j; }};int main(){// freopen("in.txt", "r", stdin); int n, b, j; int kas 阅读全文
posted @ 2013-02-08 20:19 ChrisZZ 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 题意:有n个恶龙,有m个骑士可雇佣,每个骑士能力为x,表示可以砍掉恶龙的不超过x的头,且雇佣他需要x金币。要求砍掉恶龙所有的头且付金币最少。类型:排序+模拟代码:#include#include#includeusing namespace std;const int maxn = 20000+5;int A[maxn];int B[maxn];int main(){// freopen("in.txt", "r", stdin); int n, m; while(scanf("%d%d", &n, &m)!=EOF 阅读全文
posted @ 2013-02-08 20:18 ChrisZZ 阅读(178) 评论(0) 推荐(0) 编辑