摘要:(当然,思路是大牛的)找出反转串与原串的最长公共子列(不连续),然后总长度减去这个LCS的长度即可;dp,空间优化是显然可以的,但是……先AC了再说。。;3WA:题目要求大小写是distinct,没有仔细读题就想当然地把大写转为小写了; 求c[i][j]时,比较的是x[i-1]与y[j-1]; 将c定义为字符型数组,显然通不过,字符型最大才127,就改为int吧。。1MLE:接上,int型的c会严重MLE的,题目要求最大长度为5000,short足够用,再改为short。/* LCS 问题 */# include <stdio.h># define MAX(a,b) ((a)>
阅读全文
摘要:并查集变种;# include <stdio.h># include <memory.h># define MAXN 100005int pre[MAXN];int dis[MAXN];int main(){ int n, x, y, i, mind, ans; while (~scanf("%d", &n)) { memset(dis, 0, sizeof(dis)); for (i = 0; i < MAXN; ++i) pre[i] = i; while (n--) { ...
阅读全文
摘要:并查集;/* 下面的问题已经找到原因:dev c++使用c++编译器,变量end的命名可能出现冲突,使用gcc编译不会出现报错*/遇到了一个诡异的问题:全局变量放在main外报错。# include <stdio.h># define MAXN 105int father[MAXN];int main(){ int T, sta, end, n, m, x, y; int i; scanf("%d", &T); while (T--) { scanf("%d%d%d", &sta,&end,&n); f...
阅读全文
摘要:稍微演算一下,就会发现只要把每一列大小次序依次选择元素,然后相乘相加,结果一定是最大的;比如a > b, c > da cb dac+bd > ad+bc (移向做差),然后扩展到多行多列的情况就行了。有一条警告,不知道怎么排除。29 *\csu1009.c [Warning] passing arg 4 of `qsort' from incompatible pointer type 1 # include <stdio.h> 2 # include <stdlib.h> 3 4 # define LMAX 105 5 # define C
阅读全文
摘要:换成栈就解决了超时,时间上还可以优化。 1 # include <stdio.h> 2 # include <memory.h> 3 4 # define MAXN 100005 5 6 unsigned short s[MAXN]; 7 int top; 8 9 int main()10 {11 int n, x, i, f, t, tot, top;12 13 while (~scanf("%d", &n))14 {15 f = top = tot = 0;16 memset(s, 0, sizeof(...
阅读全文
摘要:快排、二分查找,对于我来说是道好题,对大牛来说,瞄一眼就跳过了。。。 1 # include <stdio.h> 2 # include <string.h> 3 # include <stdlib.h> 4 5 # define MAXN 100005 6 7 typedef struct { 8 char s[12]; 9 char ss[12];10 } word;11 12 word dic[MAXN];13 word key;14 15 int cmp(const void *a, const void *b)16 { 17 return...
阅读全文
摘要:找到之前的错误了: else if (ch=='#' && i>=0) --i;初始条件是 i = -1; 这样i = - 1;时,如果输入“#”,应该被忽略,但这句话其实没有做到。应该这样写: else if (t[i]=='#') j = (j>=0 ? j-1:-1);由于题目中没有提到一行文本到底有多少字符,干脆定义最大为 100 吧,什么?竟然通过了!# include <stdio.h># include <string.h># define MAXN 100char t[MAXN], s[MAXN
阅读全文
摘要:C++好处理一些,C语言使用 log10(double x) 计算 x 整数部分的位数(结果要 +1): 1 # include <stdio.h> 2 # include <math.h> 3 4 int main() 5 { 6 int n, j, tmp; 7 double x, tot; 8 9 freopen("in.txt", "r", stdin);10 freopen("out.txt", "w", stdout);11 12 while (~scanf("%d%d
阅读全文
摘要:没想象中的复杂;先将园分为四块以减少计算量(还可以再细分为八块,略显复杂);判断圆是如何穿过一个像素的:对于右上方的点,只有三种情况:从右边穿过,从右下角的顶点穿过,从下边穿过;先给出一个初始像素(被穿过),然后根据穿过的情况向下一个被穿过的像素扩展,并根据情况计数;像素的表示:右上方定点的坐标:Language: CResult: AcceptedTime:236 msMemory:740 kb最快的只有128ms,求指点。 1 # include <stdio.h> 2 3 int x, y, r; 4 5 int state(int x, int y); // 1: ri..
阅读全文
摘要:1、2、3三个数字组成的序列,要求把所有的2放在前面,所有的3放在后面,输出结果。下面的代码提交了好几次(修改不大)都是WA,错误的原因是输入结束(EOF)前不一定有换行,这样最后一组测试数据就没法输出 1 和 3。 1 # include <stdio.h> 2 3 char ch; 4 int cnt1, cnt3; 5 6 int main() 7 { 8 while ((ch=getchar()) != EOF) 9 {10 if (ch == '2') putchar(ch);11 else if (ch == '1'...
阅读全文
摘要:题目来源:HDOJ1018(求阶乘的位数)斯特林公式简介(维基百科):斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用,而且,即使在n很小的时候,斯特灵公式的取值已经十分准确。公式为:这就是说,对于足够大的整数n,这两个数互为近似值。当n增加时,(ln n!)与o (n ln n − n)之比趋于1。几乎超时: 1 # include <stdio.h> 2 # include <math.h> 3 4 int main() 5 { 6 int T, x, i; 7 double sum; 8 9...
阅读全文
摘要:题目来源于HDOJ1013把一个正整数的各位数字之和加起来,如果得到一个个位数,就打印它,否则重复对和的各位数字相加,直到得到个位数,打印它;若输入为 0 则结束。这个题要处理比较大的数(字符串表示)放弃了在 while((ch=getchar() != EOF)) 下分情况讨论后(详情自己试),容易想到下面的方法: 1 # include <stdio.h> 2 3 int main() 4 { 5 char ch; 6 int ans; 7 8 while (ch=getchar() != '0') 9 {10 ans = (ch...
阅读全文
摘要:我的思路是先求出类似dp求LCS的数组c,然后计算c的对角线上元素和的最大值,由于和枚举的计算量相同,并且多了给c赋值的过程,耗时要多些,另外也多分配了c这样一个比较大的空间同样的代码分别用C和C++提交耗时分别为720ms、380ms,内存占用2700kb(C少一些,相差500kb),不解。。所有AC中最快的只有64ms,内存占用740kb。。对角线边界的判断还是需要点思考的。。/* csu 1242 */# include <stdio.h># include <string.h># define MAXN 1002char a[MAXN], b[MAXN];sho
阅读全文
摘要:超过8位只输出高低四位,中间用...隔开:Fibonacci numbers get large pretty quickly, so whenever the answer has more than 8 digits, output only the first and last 4 digits of the answer, separating the two parts with an ellipsis (“...”). 高四位的输出:利用通项公式,先求出取对数的小数部分,然后取前四位即可。第四位:直接递推会严重超时!!所以只能用矩阵幂的方法(其实题目提示了用线性代数知识:Use y
阅读全文
摘要:晕,题目上描述是 N<=20,但是建个20大小的表,提交是WA,用递归提价一下AC了。猜测是为了练习,不让大家偷懒。。猜测测试数据最大的是21。。为了偷懒,建了个25大小的表(注释部分),一提交果然AC,彻底晕倒了,要卡的话应该给个稍大一点的啊。。当然如果特别大,时间限制也要改大一点,谅解了。。。/* 1087: 斐波那契数列 *///用递归法计算第N个斐波那契数,并输出所用到的递归次数//斐波那契数列排列如下:1,1,2,3,5,8,……# include <stdio.h>int fun(int n, int *cnt);//const int f[] = {0,1,1,
阅读全文
摘要:约瑟夫环的一个特殊情形:m = 2;"我们把k设为2,然后给n个人,如果最后留下来的人是编号为n的,那么n就叫fix number.现在的问题是,如果给出一个数,要求输出是不是fix number.如果是fix number的话,就输出"Oh,It's a fix number",如果不是的话就输出"Sorry,It isn't a fix number""开始我怀疑形如 2^n-1 是 fix number(充要),只是通过拿 7 和 3 试验感觉到的,后来看了维基百科中的一段话(对k=2情况的讨论)后确信了。下面的
阅读全文
摘要:群里的朋友问了这道题,刚开始想到的最笨了:枚举,然后就是判断,要是n过大了就。。。。后来参考百度百科给出的分类考虑的方法,尝试了一下,感觉按照方法来一点也不复杂了。。不过百度百科也提到了一种通用的方法,没有尝试。#include<stdio.h># define MAXN 100int a[MAXN][MAXN];void swap(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp;}void print_odd(int n){ int i, j, t; i = 1; j = (n+1)/2; ...
阅读全文
摘要:判断一个正整数是不是勾股数(直角边),初等数论。意外:奇数可以构造(2n+1, 2n^2+2n, 2n^2+2n+1),2^n(n>=2)也是(因为4是)。。/* csu 1207 */# include <stdio.h>int main(){ int x; while (~scanf("%d", &x)) if (x<3) printf("NO\n"); else printf("YES\n"); return 0;}
阅读全文
摘要:/* WA,对测试示例结果正确,不解 */已通过,原因是%I64d的使用不符合编译器的要求,百度了一下,这个问题早就有了……非常感谢Staginner大牛的帮助!变量定义输出方式gcc(mingw32)g++(mingw32)gcc(linux i386)g++(linux i386)MicrosoftVisual C++ 6.0long long“%lld”错误错误正确正确无法编译long long“%I64d”正确正确错误错误无法编译__int64“lld”错误错误无法编译无法编译错误__int64“%I64d”正确正确无法编译无法编译正确long longcout非C++正确非C++正确
阅读全文
摘要:先标记,然后分情况判断,最后一定要多做测试。略显麻烦。/* 1031: Parsing Real Numbers */# include <stdio.h># include <ctype.h># include <string.h># define BITSET(i) ((sign)|=(char)(0x1<<(i)))# define GETBIT(i) ((sign)>>(i) & (0x1))char a[1000];char sign;/* sign: 0 - wrong? 1 - coeff sign 2 - in
阅读全文