POJ
文章平均质量分 66
SeasonJoe
这个作者很懒,什么都没留下…
展开
-
POJ 1006 与中国剩余定理
要点: 设num为下一个triple peak出现的时间。则可以得到以下三个等式: num%23==p;num%28==e;num%33==i; 可以使用暴力枚举法,但这里学到了一种新算法———中国剩余定理算法中国剩余定理介绍: 《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“23”。 ——–这个就是传说中的“中国剩余定原创 2015-11-01 21:55:16 · 481 阅读 · 0 评论 -
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 · 615 阅读 · 0 评论 -
POJ3104 二分
题意: 有n件湿衣服,含水量分别为a[0~n-1],烘干机每分钟可以除去k份水,每过一分钟每件衣服自动蒸发1份水,注意在烘干的时候不会自动蒸发水要点: 1.注意会超int,所以用long long 2.一个小技巧,整数运算中,a/b的上取整可以用(a+b-1)/b。 3.用二分枚举mid,如果一件衣服水量大于mid时,最短的时间是自动蒸发mid分钟,在烘干一段时间,为了将正在烘干的衣服也进入原创 2015-12-09 15:47:37 · 248 阅读 · 0 评论 -
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 · 490 阅读 · 1 评论 -
POJ2456 二分
题意: 有一排n间固定位置的牛房,放入c头牛,使每头牛之间的间隔最小值最大要点: 猜测输出的间隔为mid,先排序,再从第一间开始放入牛(第一间肯定要放,这样最高效)进行a[last]+mid<=a[i]的判断,比较特别的是每次判断成立后要改变last的值,也就是从第一间开始如果满足条件马上作为第二间,再从第二间开始判断,说不太清楚,看代码吧感悟: 二分做的差不多了,接下来再做也就是题目角度的不原创 2015-12-11 12:28:48 · 516 阅读 · 0 评论 -
POJ3579 二分
这题也是二分,但有很多特殊的地方: 题意是输入一串数,这些数之间的差排成一列,找出其中的中位数第一次二分枚举猜测中位数为mid,比较a[i]+mid与后面的数,与m比较确定区间,第二次二分是在比较的过程中,如果用两个迭代还是N^2,所以用二分求上界,总数减去返回的下标值就是后面大于或等于a[i]+mid的数量。这题有个奇怪的地方,说是第m/2个最小值为中位数但如1,2,10的差是1,8,9,中位数原创 2015-12-10 21:28:52 · 411 阅读 · 0 评论 -
POJ3273 二分与最大值最小化
题意:给出农夫在n天中每天的花费,要求把这n天分作m组,每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值要点: 与二分求最小值最大化一样,还是先猜测一个数mid进行比较,然后二分减小区间,过oj的时候RE了好几次,后来才发现是数组区间开小一位了,注意RE也有可能是这种情况#include<stdio.h>#include<string.h>#defi原创 2015-12-08 21:30:11 · 392 阅读 · 0 评论 -
POJ1159 回文串DP与MTE,滚动数组
题意:输入一串字符串,插入一些字符使这个字符串变成回文串,求插入字符个数的最小值要点:可以这么看,设字符串为C1,C2,C3……Cn,如果C1==Cn,那么只要再考虑C2是否等于Cn-1即可,如果不相等,有下列两种选择:在串后加C1'==C1,即C1,C2……Cn,C1',那么只要继续求C2……Cn即可。或在串前加Cn'==Cn,即Cn',C1,C2……Cn,那么只要求C1,C原创 2015-12-27 13:55:49 · 491 阅读 · 0 评论 -
POJ3614与优先队列
优先队列这个博主讲的比较全题意: 奶牛晒太阳,有下限和上限,要保证晒到上下限之间,每瓶防晒霜可以固定一头奶牛晒到一个固定值,求最多几头奶牛可以达到要求要点; 先把奶牛按照最小值从小到大排序,在把防晒霜从小到大排序,从最小的防晒霜枚举,如果大于奶牛的最小值就把奶牛的最大值放入优先数列(从小到大),这样的话每次只要比较优先数列的第一项与奶牛的最大值就可以了。这里面也有贪心的思想,每次防晒霜优先涂最大原创 2015-12-13 11:12:56 · 399 阅读 · 0 评论 -
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 · 1123 阅读 · 0 评论 -
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 · 299 阅读 · 0 评论 -
POJ1442 大根堆和小根堆找第k大的数
题意: 给定M个数,每次可以插入序列一个数;再给N个数,表示在插入第几个数后输出一个数,第一次输出序列中最小的,第二次输出序列中第二小的……以此类推,直到输出N个数。第一次做只用一个优先数列超时了,后来上网看到要用最大堆和最小堆维护做,下面是思路:原创 2015-12-13 16:23:27 · 1811 阅读 · 0 评论 -
POJ1979 DFS
题意:从@开始走,可以走“.”但不能走“#”,统计能走到的“.”个数要点:很简单的搜索题,DFS,算法简单无比,防止越界并且不能碰到“#”,走过的“.”不能重复走,这几个条件控制好递归DFS就可以,居然WA了快20次,最后发现是输入的时候用scanf句尾\n也算进去了,但换用字符串输入也WA了很多次,主要是忘记字符串输入是自带从0开始,我一直用1开始在做,这周开始搜索联系。代码如下原创 2015-12-15 16:48:25 · 479 阅读 · 0 评论 -
POJ2362 DFS+剪枝
题意:有一组小棒,这些小棒全用上看能不能拼成一个正方形,可以多个小棒拼成一条边要点:DFS+剪枝,这题才是真正的搜索题,做的我心潮澎湃,相比前面那一题根本就不能算是搜索。原创 2015-12-16 15:19:53 · 440 阅读 · 0 评论 -
POJ1011 经典DFS+剪枝
题意:给你n个小棒碎片,要求还原原棒长,求最短原棒长要点:经典搜索题,有很多剪枝,很早之前就想做一下,现在终于有水平可以做了,感觉水平还是有进步的,原来根本看不懂,现在好歹看的懂了,主要是各种剪枝实在是比较难想到。从最大的一个碎片开始到碎片总和,一个个DFS是否为原棒长剪枝:1.原棒长必须是总数的因数2.每次一开始从最大的碎片开始遍历,如果一开始的无法搜索成功直接剪掉,原创 2015-12-17 16:47:24 · 516 阅读 · 0 评论 -
POJ3258 二分与最小值最大化
题目的意思就是一排石子,拿走几个,使这些石子相邻间距中的最小值最大。不会做,只能看网上的代码,发现解释也很少,最后还是自己一点点搞懂的,但没完全搞懂,有的地方还是略不理解这题看了网上的代码都是用二分法,那么思路是这样的,先排序,然后再从大到小假设要求的区间mid,这个区间就是一直二分得到,那么用这个区间和相邻石子的区间比较,如果小于这个区间,就把后一个石子拿走(因为前一个如果是第一个拿不走啊),并且原创 2015-12-08 18:00:07 · 633 阅读 · 0 评论 -
POJ1001 Exponentiation
高精度幂,大整数题。之前没完成大数的四则运算,一直跳过没做,周末把大数的乘法搞出来了,挑战了一下这道题 要点: 1.先将小数去除小数点用大数的乘法先得到整数数据,再进行小数点的加入,还要去除前后的0原创 2015-12-01 13:39:14 · 290 阅读 · 0 评论 -
POJ1321 DFS
一个简单的搜索问题,但我还是搞半天搞不出来,递归实在是用不好这题比八皇后难一些,k==n时,就是八皇后问题,但k代码如下:#include#includechar a[8][8];bool col[8];int n,k,tot;void dfs(int x, int row){ if (x == k) { tot++; //每次等于k次数+1 retu原创 2015-12-18 17:20:27 · 351 阅读 · 0 评论 -
POJ3122 二分与误差
题意:n个派f+1个人分(包括自己),同一个派可以分成多块,但每个人只能拿一块,并且不能拼接比如一块6派,如果拿5,剩下的1就得丢弃要点:1.比较普通的二分,将每块派大小除mid,累加得到分给的人数。要注意mid也就是每个人分到的派可以是浮点数。2.要求精度问题,因为left和right都是double型,mid=(left+right)/2,所以这两个只能无限接近。因为最后答案都原创 2016-01-19 21:42:28 · 374 阅读 · 0 评论 -
POJ3664 Election Time
水题,但我第一次写的代码WA了好几次,后来分析得:原来我用a[i]*1000+i来保留的做法进行快排时,a[i]相同时也会有大小之分,但题目数据检验时应该是按照普通快排排列的(随机),所以通过不了,后来改了一下结构体过了。#include<stdio.h>#include<string.h>#include<stdlib.h>struct fun { int x, y,原创 2015-12-01 18:33:39 · 433 阅读 · 0 评论 -
POJ1804 Brainman
水题,没啥好说的,归并排序求逆序对 代码如下:#include<stdio.h>#include<stdlib.h>int a[1000000], b[1000000];int num;void mix(int *a,int *n,int left,int mid,int right){ int i = left; int j = mid + 1; int k =原创 2015-12-03 10:23:26 · 405 阅读 · 0 评论 -
POJ1014 DFS
题意:一组价值从1到6的弹珠,每个价值对应输入相应的个数,判断能否平均分为两组要点:简单DFS,一开始我直接套用模板超时了,主要原因是我又重新设了一个数组想储存这些对应的价值,这肯定就慢了,其实不需要,对应的i就是价值,所以直接dfs就可以PS:看网上一般都是用背包问题做的,下次研究一下换种方法再做一遍代码如下:#include#includeint n[7];int原创 2015-12-20 15:24:00 · 720 阅读 · 0 评论 -
POJ2503 二分&&结构体字典序排序&&sscanf函数
题意:就是模拟一个查字典的过程,先输入互相对应的英语和外国语作为参照,再输入一些外国语,要求输出对应的英语要点:1.结构体的字符串排序struct Node{ int data; char str[100];}s[100];//按照结构体中字符串str的字典序排序int Comp(const void*p1, const void*p2){ return strcm原创 2016-01-21 11:23:02 · 746 阅读 · 0 评论 -
POJ3278 BFS
题意:输入两个数n和k,n一步可以-1或+1或*2,把n经过一系列变化变成k,计算最小的步数要点:这是我做的第一道BFS题,BFS的特点就是往四周延生,一般同一层次的状态是相同的,用树来举例就是一层层向下,先确保一层完成再往下,用迷宫举例就是如果第一步往上第二步往右,它的状态和第一步往左,第二步往上是相同的,即每一步构成一个集合。一般BFS都是用队列做的这道题还是很好理解的,总共可原创 2015-12-20 21:39:25 · 434 阅读 · 0 评论 -
POJ3176 DP水题
题意:三角形从上到下求最大值,只能向下或向右下要点:好简单的DP题,看了一下白书DP的介绍,3分钟就过了,DP白书上有很详细的解释,可以好好看看代码如下:#include#includeint max(int a, int b){ return a > b ? a : b;}int main(){ int n,i,j; int dp[355][355], a[原创 2015-12-21 19:04:43 · 384 阅读 · 0 评论 -
POJ1088 记忆化搜索
题意:滑雪只能从高的地方滑到低的地方,输入一个二维数组记录了高度,求最长能滑的次数(从一个高度滑到另一个高度记为1)要点:记忆化搜索,就是将DFS和DP结合起来,从当前位置向上下左右深搜,并用DP取最大的那一个,这样从每一个位置得到一个值,最后比较得到最大值代码如下:#include#includeint a[105][105],dp[105][105];int m, n原创 2015-12-21 21:31:12 · 439 阅读 · 0 评论 -
POJ1012 打表&&约瑟夫问题详解
题意:约瑟夫问题的变形,总共k个好人和k个坏人,好人先排在坏人前面,寻找一个最小的m,使每次杀的都是坏人,保证坏人比好人先死要点:先打表把1-14的所有情况都赋值给一个数组,然后直接对应输出就行约瑟夫问题:维基百科:点击打开链接百度百科:点击打开链接设拿走k个的位置为ans[k],ans[k]=(ans[k-1]+m)%(n-k)15095637原创 2016-01-22 20:06:20 · 820 阅读 · 0 评论 -
POJ3750 循环链表解决约瑟夫问题
题意:就是约瑟夫斯问题,首先从一个人开始,越过k-2个人(因为第一个人已经被越过),第k个人出列。接着,再越过k-1个人,第k个人出列。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下。依次输出每个出列的人要点:利用循环链表来实现,每次删除结点并输出这个结点的值。实际上最好用双向循环链表,但我用普通的循环链表强行完成了,比较容易WA,有很多特殊情况要考虑:比如:如果s=1时,第一原创 2016-01-20 21:32:38 · 971 阅读 · 0 评论 -
POJ1050与最大连续子段和,最大子矩阵问题
最大连续子段和:一组连续的数:-4 2 1 5 -2 9,这组数据的最大的连续子段和解无疑是15,但怎么求出它呢?这里就有DP的思想首先,用0作为分界点,不难想到如果用一个dp[k]数组储存当前子段和如果dp[k]>=0,dp[k]=dp[k-1]+a[k]但如果dp所以写出状态转移方程:dp[j]注意:dp只是储存子段和的数组,要求最大值还得扫一遍数组最大子原创 2015-12-22 15:30:28 · 608 阅读 · 0 评论 -
POJ1068 Parencodings(模拟)
题意:一串左右括号,有下列两种编码方式:P序列:第i右括号前有几个左括号为pi的值W序列:第i右括号与前面的左括号匹配完成后,括号中有几个右括号就是wi的值输入P序列,转换为W序列输出要点:用一个p数组记录每两个右括号中有几个左括号,例如:4 5 6 6 ,对应的p数组为:4 1 0 0 从第一个右括号i开始往左寻找,如果碰到p[j]!=0的情况说明这个位置可以找到一个原创 2016-01-23 16:25:54 · 343 阅读 · 0 评论 -
POJ1008 Maya Calendar(模拟)&&整除和取余的边界问题
题意:玛雅有两种计年方式,输入一种年月日,输出对应的另一种年月日要点:1.注意题目要求,第一种还有第19月,一开始没看见,然后输出是一起输出,不是一个一个输出2.这题主要的一个难点是有关/和%的边界:例如:26/13=2,26%2=0,如果我想使整除26/13=1,即向下取整,并且想使26%13=13,该怎么办呢?有个非常好的解决方案就是将要除的数整体-1,也就是原本我们从原创 2016-01-23 18:33:42 · 618 阅读 · 0 评论 -
POJ1013 Counterfeit Dollar(技巧)
题意:有十二枚硬币,其中有一枚假币与其他真币重量不同,但不知道是轻是重,通过称量三次确定这枚硬币的字母代号要点:题目中没有说每次称量几枚硬币,所以用模拟非常复杂,这里有一个比较特别的技巧:先如果天平是平衡的,那么对于的所以硬币肯定是真的,用一个数组存储将这些硬币剔除,后面计算时就不用考虑了。因为不知道假币是轻还是重,那么如果出现up和down,那么肯定这其中有假币,但是不知道是那边原创 2016-01-25 20:48:52 · 1480 阅读 · 0 评论 -
POJ1083 水题
题意:两排房间搬桌子但只要一个走廊,输入一组房间号,求最短搬完的时间要点:就是一个区间求交集的问题,输入的两个房间号作为前区间和后区间,有交集说明不能同时搬,交集最大值即为至少需要的时间。注意看图,前区间如果是偶数要-1,后区间如果为奇数要+1,例如:2,3实际对应的区间是1,4,看图可以知道这个区间内的走廊都不能用ps:话说这道题分类是dp来着,感觉没有关系啊代码如下:#原创 2015-12-24 19:11:30 · 381 阅读 · 0 评论 -
POJ2385 经典DP
题意:站在树下接苹果,总共两棵树,每一分钟有一根树掉下一颗苹果,从一棵树移动到另一棵树下为动一次,先站在第一棵树下,问经过t分钟,动w次,最多能接到几个苹果要点:经典dp题,状态分为动与不动两种,所以状态转移方程可以写为dp[i][j] = max(dp[i - 1][j] + (a[i] == j % 2 + 1), dp[i - 1][j - 1] +( a[i] == j % 2原创 2015-12-25 21:03:27 · 355 阅读 · 0 评论 -
POJ1363 Rails(数据结构栈)
题意:一列火车从A站进入,B站开出,中间有一个站台,可以改变车厢顺序,原本是1~n,看输入的序列能否达到要点:就是模拟栈的压入弹出,如果栈顶元素对应的编号与输入的顺序一致就弹出,如果不一致就继续压入。最后如果栈是空的就说明顺序是合法的,否则不合法15114206Seasonal1363Accepted164K63MSC++646B20原创 2016-01-27 17:35:53 · 485 阅读 · 0 评论 -
POJ1458 LCS
求最长公共子序列,以前那篇用DP的说实在的没真正搞懂,现在学了DP稍微好一点,但感觉思维还是不通透的感觉顺便贴一下LCS的图解算法s1:2 5 7 9 3 1 2s2:3 5 3 2 81. 阵列开头均设为空2. S1[i]=S2[j]相同,dp[i][j]则继承左上方向dp[i-1][j-1]的值+13. 不相同dp[i][j]则继承 上方与左方中的最大数值,也即原创 2015-12-27 16:19:38 · 363 阅读 · 0 评论 -
POJ1157 花店问题经典DP
题意:花店摆花,不同的花放进不同的花瓶美观度不同,排在后面的花不能放在排名前的花放入的花瓶的前面的花瓶要点:首先注意题意,加入花1放入第2个花瓶,花2就只能放在第3个花瓶或更后面,这样就简单多了,否则估计要用搜索。这样问题就近似于数字三角形,首先设一个数组dp[i][j]记录当前最大美观度,i代表前i朵花,j表示前j个花瓶。那么就有两种状态,第一种是往右边走,第二种是往右下走,其实原创 2015-12-26 22:19:28 · 619 阅读 · 0 评论 -
POJ1160 邮局问题
题意:m个村庄排在同一直线上,在之中建立n个邮局,要求这些村庄到最近的邮局之和最小要点:这道题挺难的,思路比较难想到不说还比较难理清首先:在第a个和第b个村庄中建1个邮局的邮费最小方案应该是建在第(a+b)/2个村庄里,说实在的这个我一开始都不知道。然后问题就可以拆成DP问题:在前k个村庄中建i-1个邮局加在第k+1到第j个村庄中建1个邮局,这就是一个典型的DP问题了。状态转移原创 2015-12-27 10:39:47 · 1483 阅读 · 0 评论 -
POJ1163 DP水题
水题,数字三角形,最近dp做的真不怎么样,找点信心代码如下:#include#include#include#includeusing namespace std;int main(){ int a[150][150], dp[150][150]; int n; while (scanf("%d", &n) != EOF) { int i, j; for (i原创 2015-12-27 11:38:40 · 356 阅读 · 0 评论 -
POJ1046 Color Me Less(水)
题意:颜色由(R,G,B)组成,先输入16组颜色制成表,再输入一些颜色,寻找与表中最接近的颜色要点:水题,简单的不得了,春节期间练练手,这几天学习效率非常低下,节日的气氛还是有些影响15147087Seasonal1046Accepted400K16MSG++618B2016-02-07 16:43:17#in原创 2016-02-07 19:59:15 · 345 阅读 · 0 评论