- 博客(22)
- 问答 (1)
- 收藏
- 关注
原创 大数的加减乘除
最基本的一个运算,可以用数组或指针做 1.加法 一:数组1.自己的代码,真是一点都不简洁,水平有限啊!#include#includeint max(int len1, int len2){ return len1 > len2 ? len1 : len2;}int main(){ char s1[100], s2[100],s3[100]; in
2015-11-29 15:12:47 455
原创 POJ2250 Compromise (LCS)
要点: 1.比较基础的lcs题,关键在于输入时用字符串输入,输出时用递归#include<stdio.h>#include<stdlib.h>#include<string.h>int len1, len2;char a[500][35], b[500][35];int num[500][500], flag[500][500];void lcs(){ int i, j;
2015-11-28 19:58:01 280
原创 最长公共子序列和最长公共子串
也是DP中的经典问题,最长公共子序列(LCS)不用连续而最长公共子串要连续。 最长公共子序列: 一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。 最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。 可以用两种算法:递归;DP算法一:递归 代码为:#include<stdio.h>#include<string.h>ch
2015-11-27 20:55:45 482
原创 POJ1609 二维数组快排+LIS
要点: 1.先进行排序,在用lis。lis倒不是问题,用n^2的就行了,但二维数组的快排搞了一个晚上,总是出错,最后还是先弄明白了二维数组的快排才AC的#include<stdio.h>#include<stdlib.h>int ans[100000];struct node{ int x,y;};node a[10000];int cmp(const void*p1,const
2015-11-26 22:33:04 1105
原创 快速排序(二维数组)
会用qsort函数,但一直搞不清cmp返回值的作用,而且不会二维数组的排序,做poj1609的时候因为二维数组的快排WA了一个晚上,实在郁闷。下定决心彻底搞懂它,以后一点点的补充。qsort函数是编译器函数库自带的快速排序函数,头文件是stdlib.h 用 法:qsort(void base,int nelem,int width,int (*fcmp)(const void ,const voi
2015-11-26 22:30:43 6272 1
原创 POJ1887 Testing the CATCHER
要点: 1.即求最大下降子序列,可以直接将数组倒过来用求最大上升子序列的算法 2.如何用-1结束程序一开始没理解,题意就是每组开始时如果第一个输入的是-1就跳出 3.这题数据比较水,用n^2的也能过,不过为了充分理解我把两种都写一遍一:O(n^2)#include<stdio.h>int main(){ int a[50000],dp[50000]; int i, j
2015-11-23 20:36:58 473 1
原创 二分查找求上下界的两种不同算法
在学习LIS的O(nlogn)的算法时看到了二分法求下界的概念,所以回白书学习了一下在有序表中查找元素时经常用到二分法,普通的二分查找很简单,就是不断改变区间。二分查找只适用于有序数列,时间复杂度为O(nlogn)二分查找(迭代实现):int bsearch(int *A, int x, int y, int v){ int m; while (x < y) {
2015-11-22 10:40:57 2775
原创 最长上升子序列(LIS)的两种算法
要点: 1.假设一个序列为{3, 4, 2,5},它的最长上升子序列是3,4,5,一开始我以为一定要连续的才行,搞了半天,以为网上的代码都是错的,晕死。实际只要比前面大即可。 2.求这个问题有两种算法,一种时间复杂度是O(n^2),另一种用二分为O(nlgn)算法一:#include<stdio.h>int main(){ int max = 0, i, j; int n;
2015-11-21 18:19:09 649
原创 习题3-11 UVa1588 Kickdown
要点: 1.有三种可能:全在底板上,部分在底板上以及一点都不能在底板上,所以输入的字符串的长度有关系,同一组颠倒顺序结果不一样,因此求出两种取最小值#include<stdio.h>#include<string.h>int main(){ char a[110], b[110]; int i, j, m, n,t; while (scanf("%s%s", a, b
2015-11-20 19:49:55 535
原创 例题4-5 UVa512 Spreadsheet Tracking
方法一: 要点: 1.利用三个函数,几乎涵盖了前面所学所有内容#include<stdio.h>#include<string.h>#define maxn 100#define big 10000int r, c, n, d[maxn][maxn], d2[maxn][maxn], ans[maxn][maxn], cols[maxn];//d2作为表格变化中原表格的存储,通过ans
2015-11-14 17:26:21 738
原创 习题3-6 UVa232 Crossword Answers
要点: 1.其他的很简单,关键是输出的时候要用for语句时要注意把原来的赋值为0跳过去,否则同一个单词会多次输出 2.注意格式,从第二个开始,input和output要隔一行,PE了好多次#include<stdio.h>#include<string.h>int main(){ int r, c; int p = 1; int num[12][12]; //作为
2015-11-14 11:06:32 477
原创 ???习题3-10 UVa1587 Box
1.低端暴力枚举法要点: 1.先判断6个长方形两两相等,然后将三个互异的长方形长和宽存入数组mark,再通过暴力枚举比较,任意两个长方形中必定有两个数相等#include<stdio.h>int a[6][2];int mark[6];int main(){ while (scanf("%d%d", &a[0][0], &a[0][1]) == 2) { //
2015-11-13 21:39:22 405
原创 习题3-9 UVa10340 All in All
要点: 1.应该由较长的字符串迭代寻找,否则从小的开始,若存在多个字母重复出现的情况会出现错误,长字符串一遍走完,一个个寻找跟小字符创相同的字符#include<stdio.h>#include<string.h>int main(){ char s[100000], t[100000]; //s是较小的那个,t是较大的那个 while (scanf("%s %s", s,
2015-11-12 22:10:38 465
原创 习题3-5 UVa 227 Puzzle
难点: 1.行与列的关系难理清要点: 1.scanf(” %c”,&c),(注意前面的空格)可以跳过换行符等#include<stdio.h>#include<string.h>char map[5][5];const int y[] = { 0,0,1,-1 };const int x[] = { -1,1,0,0 };int tra[110]; //移动行所在的数组bool le
2015-11-11 19:51:57 603
原创 例题4-3 UVa 133 The Dole Queue
要点: 1.建立一个数组储存数值,并建立一个go函数来移动数组元素,若已经出现过,则将数组元素赋值为0,并在数数时跳过即可难点: 1.建立go函数时的数据关系难以想出,A的初值为n,逆时针步长为-1,但进行第一步后得到n,接着为n-1,n-2……B的初值为1,顺时针步长为1,第一步可以得到1,接着即为2,3……#include<stdio.h>int a[25];int i,n,k,m;i
2015-11-10 19:53:30 514
原创 POJ 1002 487-3279 与二维数组的快速排序
要点: 1.一道模拟题,关键在于将所有输入转化为统一格式,再进行快排,这样可以通过统计与前一个相同的个数来统计相同的个数难点: 1.二维数组的快排可以通过qsort(phone,n,9,strcmp)来排序,即将其看为一个元素数目为n,每个元素长度为9的一维数组,原9个元素看成一个长元素,进行字符串比较。至于strcmp函数,定义为若str1==str2,则返回零;若str1>str2,则返回正
2015-11-08 09:58:22 598
原创 例4-2 UVa489 Hangman Judge
要点: 1.利用一个left变量判断还剩几个字母,用chance判断还能猜几次,原来chance放在开头导致一直WA#include<stdio.h>#include<string.h>#define maxn 100char s[maxn], s2[maxn];int left, chance,t;int win, lose;void guess(char ch){ int
2015-11-07 20:26:08 358
原创 例题4-1 UVa1339 Ancient Cipher
要点: 思路比较难想到,因为字母可以重排,则每个字母的位置不重要,重要的每个字母出现的次数,统计每个字母出现的次数,得到两个数组cnt1[26]和cnt2[26],将两个数组分别快排,若结果相同,则说明两个字符串中对应字符数目相同(对应什么字符不要紧,可以一一映射转换)#include<stdio.h>#include<string.h>int cmp(const void*a, const v
2015-11-06 22:43:37 512
原创 习题3-8 UVa202 Repeating Decimals
难点: 1.格式输出太蛋疼,题目上没讲,只能看output自己推测要点: 1.小数部分的输出可以用这么一种算法:后一位余数=(前一位余数-前一位小数*b)*10 后一位小数=前一位小数/b 例如5/43=0.(116279069767441860465),先将mod[0]赋值为5,f[0]赋值为5/43=0,mod[1]=(5-0*43)*10=50,f[1]=50/43=1 以此类推。
2015-11-04 22:20:24 477
原创 习题3-7 UVa1368 DNA Consensus String
要点: 1.比较简单的字符串问题,不解释了#include<stdio.h>#include<string.h>#include<stdlib.h>int cmp(const void *a, const void *b){ return(*(int*)b - *(int*)a);//快排从大到小输出}int main(){ int m, n,t; char s
2015-11-03 16:46:30 418
原创 POJ 1006 与中国剩余定理
要点: 设num为下一个triple peak出现的时间。则可以得到以下三个等式: num%23==p;num%28==e;num%33==i; 可以使用暴力枚举法,但这里学到了一种新算法———中国剩余定理算法中国剩余定理介绍: 《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“23”。 ——–这个就是传说中的“中国剩余定
2015-11-01 21:55:16 465
原创 习题3-2 UVa 1586 Molar Mass
难点: C123H5OH12—- 下标出现多位数的情况要点: 1.另设一个getnum函数,当字符串出现数字转入,由此输出多位数的情况源代码:#include<stdio.h>#include<string.h>const int maxn=200;char s[maxn];double ans[maxn];int getnum(int pos, int len){ int te
2015-11-01 10:57:45 536
空空如也
竖式问题为什么vs2015通过不了?
2015-10-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人