ACM_POJ
luke2834
A junior researcher~
展开
-
POJ 1142 分解质因数练习
题意 史密斯数定义:一个数按十进制位拆分求和 == 这个数分解质因数后,所有质因数十进制位拆分求和的和,但该数不能使质数。然后给你一个数n,问你比它大的最小史密斯数是几。思路 纯暴力即可,但要注意排除质数,并且是大于n不是大于等于n。#include #include #include #include #include #include #include #includ原创 2015-01-23 16:39:13 · 651 阅读 · 0 评论 -
poj 1065 贪心 或 dp
这题弄得我心情不好。。回头我再写思路。。先贴个代码#include #include #include #include #include using namespace std;typedef pair pii;#define mp make_pair#define fi first#define se secondconst int maxn = 5005;c原创 2015-11-09 13:31:54 · 306 阅读 · 0 评论 -
POJ3181 完全背包+高精度数模板
题意有1~k,这k个数,每种数可以用任意多次,问你组成n的方案数N<=1000,k<=100思路就是完全背包,把k种物品,第i种重量为i,重量限制为N的方案数,只要把原本的max改为sum即可由于k,n比较小,我就没优化的写了一个,将将过。。之后重写了一个优化后的,就都贴出来了注意要用高精度数实现没优化的#include <iostream>#include <cstring>#i原创 2015-10-27 18:17:18 · 467 阅读 · 0 评论 -
POJ 3734 矩阵加速dp
题意n长序列,每个位置可染4种颜色,问你第1,2种颜色都染偶数个位置的染色方法数。思路递推,a[i]表示前i个位置,题中所问,b[i]表示颜色1是偶数且2是奇数的染色方法数,c[i]表示2是偶,1是奇的方法数,d[i]为都是奇数时的方法数a[i] = 2*a[i-1] + b[i-1] + c[i-1]b[i] = 2*b[i-1] + a[i-1] + d[i-1]c[i] = 2*c原创 2015-12-28 20:37:23 · 355 阅读 · 0 评论 -
POJ 2392 简单dp 多重背包
题意有很多种石头,每种石头的高度是hi,但是不能放到ai之上的高度,并且这种石头有ci个将这些石头叠加起来,问能够达到的最高高度思路看白书上说是稍加思考的题目。。。为什么我觉得还没有优化递推关系的那些题难。。。和一般背包稍有不同的就是对石头按ai排序。。。然后再做。。这个很好理解这里就不多说了。。这样纯做,复杂度有点虚,不过dp常数小。。试了试就过了。。实现#include <iost原创 2015-12-23 13:30:34 · 413 阅读 · 0 评论 -
POJ 2686 状压dp
题意给你一个无自环、无重边的m个点,p条边无向图,边有权值你每走一条边,要用掉一张票,票也有权值,你的花费=边权/票权问你从a到b的最小花费。思路状压dp,dp[i][s]表示,当你手里还有票如集合s中所示,且你在i点,到b点的最小花费。转移也很好想,这里不多说了。。问题是,迭代顺序,我一开始没多想,就直接写了个记忆化搜索。。结果T了。。其实,仔细一下,发现更新dp[i][s]时,其原创 2015-12-24 12:06:42 · 358 阅读 · 0 评论 -
POJ3041 Asteroids 二分图最小顶点覆盖 Dinic求解最大流
题意一个n*n的矩阵,有k个位置有小行星,一炮可以摧毁一行或一列行星问最少需要多少炮可以摧毁所有行星思路把一行、一列看成节点,矩阵里的一个小行星看成一条边,如行星位置(r,c),则第r行的节点和第c列形成的节点间有一条边。然后我们的问题就变成了求解该图的最小顶点覆盖因为行和行的节点之间无边,列和列也一样,因此可以形成二分图,所以用最大流求解即可实现#include <cstdio>#原创 2016-04-02 21:41:00 · 877 阅读 · 0 评论 -
POJ3281 Dining 最大流
题意n头牛,f种食物,d种饮料每头牛会有喜欢的食物和饮料每种食物和饮料只能供给一头牛牛可以喜欢多种食物和饮料问最多可以让多少头牛同时享受到喜欢的食物和饮料思路我们把食物,牛和饮料作为节点,把“喜欢”作为无向边这样就可以连出一个三阶段的图如果我们定向这些边,然后把食物和虚拟源点相连,饮料和虚拟汇点相连,边的容量为1,可以通过求解最大流来求解吗?这样显然还有问题,因为牛的节点其实只能原创 2016-04-02 22:25:31 · 323 阅读 · 0 评论 -
POJ3469 Dual Core CPU 最小割求解最小费用划分集合
题意两个核执行n个模块,每个模块在两个核上运行花费不同另外,m对模块如果在不同核上运行,会有额外的花费求解最小花费的划分方式思路最小费用划分成两个集合,是经典的题目类型,经常会用最小割求解可以想象,我们加入一个源点s,一个汇点t,那么求完最小割,从s出可以连到的点是在一个集合,不能连到的在另一个集合,每个边的容量对应费用,那么最小割就是一种最小花费的划分方式了对于这个题,网络中的点是模原创 2016-04-11 23:24:47 · 444 阅读 · 0 评论 -
POJ2135 Farm Tour 无向图最小费用流
题意给你一个无向图,问你从1号节点到n号节点,再从n号节点返回1号节点,且中间不走重复路的最短路径。思路开始的简单思路肯定是,先求一个最短路,再删除其中的边,然后再跑最短路。问题是,这样贪心的话,会出现有两个条最短路,我们不知道选哪个好的情况~这样不行我们想,用最小费用流来求解。其实1->n和n->1对于无向图来说是没有区别的,那么我们是不是可以认为就是从1->n去两次,那么也就是流量为原创 2016-03-26 11:06:10 · 1758 阅读 · 0 评论 -
POJ3057 Evacuation 最大流+二分答案
题意在一个用矩阵描述的房间里,每个非墙位置都有一个人矩阵外侧一圈,是墙或者门每个人移动一格的时间为1,但是每个时刻通过门的人数只能为1问你最快所有人出房间的时间为多少思路 首先,我们很容易想到,给你时间t,看能不能出门,这样可以二分求解如果知道用网络流解该题,这个题的难点就在乎于如何表达每个时刻只能过1人这个信息把时间拆开,每个门和每个时刻组成一个二元组,那么通过这个二元组的流量最多原创 2016-04-10 07:33:30 · 817 阅读 · 0 评论 -
POJ 3259 判断负圈
题意图中两种边,一种正权值双向边,一种负权值单向边问是否存在负圈思路简单模板题,SPFA如果有节点入队超过节点数次,则存在负圈实现#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <queue>#include <algorithm>using namespace st原创 2016-06-23 15:10:29 · 960 阅读 · 0 评论 -
POJ 2718 暴力
题意给你一个0-9的串,挑其中一部分的数字排列成一个数,其它数字排列成一个数(两个数都不能有前导0)问你这两个数差的绝对值最小是多少思路n很小,2-10,数字不会重复出现,直接暴力枚举即可注意,不能复杂度过高,稍微有些技巧的就是两个数的位数应该尽可能接近,即都是n/2最好所以枚举全排列,计算下在n/2的位置前后两个数差是几即可#include <iostream>#include <原创 2017-07-11 08:48:43 · 255 阅读 · 0 评论 -
POJ2823 滑动窗口 单调队列模板题 第一次用了发函数指针
题意 有一个n长的序列,用k长的窗口在上面滑动,去每次窗口中最小和最大的数。思路 使用单调队列,思路就是,维护这个队列是单调的。以取最小元素为例,若窗口内左边元素>=右边元素,则左边边元素失去保留的意义。因此我们的单调队列是递增的。用STL的deque实现单调队列。#include #include #include #include using namespace st原创 2015-04-29 16:59:53 · 641 阅读 · 0 评论 -
POJ3468 区间加,区间求和 线段树模板
好久没写线段树了,手有点生。。。更新的时候居然忘了更新sum集。。。最近要多练练线段树了。。。#include #include #include #include #include using namespace std;const int maxn = 100005;typedef long long ll;ll addv[maxn<<2];ll sumv[m原创 2015-04-12 08:55:02 · 591 阅读 · 0 评论 -
POJ2538 还能再水一点吗...
#include #include #include #include using namespace std;map mapp;int main(){ mapp['1'] = '`'; mapp['2'] = '1'; mapp['3'] = '2'; mapp['4'] = '3'; mapp['5'] = '4'; mapp['6'] = '5'; mapp['原创 2015-03-15 17:39:47 · 583 阅读 · 0 评论 -
POJ3280 串上的DP
题意 一个字符串,可以在任意位置加字符或者删去任意字符,使得字符串成为回文串。加不同字符或删去不同字符有不同的代价,问使得它成为回文串的最小代价是多少?思路 这题本身不难,和最长公共子序列很相似,但我做类似的dp较少,状态没有找好,费了不少功夫。下面列出破题的主要几个重点:(1)删去和添加同一个字符本质是一样的,只要取那个代价小的就行(2)状态取从i位置到j位置的最小代价,dp[i][原创 2015-03-15 20:10:50 · 414 阅读 · 0 评论 -
poj2229 简单DP
题意 把n拆分为2的幂相加的形式,问有多少种拆分方法。思路 比较好的DP方案开始没有想到,所以这里列出两种方案吧 (1)DP(i,j)表示第i个数,最小数由2的j次方来组合得到的方案数。状态转移dp[i][j] = (dp[i][j+1] + dp[i-(1初始条件 dp(1,0) = 1 (2)更好更简单的方法是分奇偶考虑,奇数时就是dp(i) = dp(i-1)原创 2015-03-10 21:03:15 · 364 阅读 · 0 评论 -
POJ3616 简单DP
题意 有m个区间,区间有一个权重,区间间有交叉,问你怎么选择区间让权重之和最大思路 这题递推时,主要要想到,如果新的区间和之前选好的那个区间有交叉,那么去掉已选好区间最后面的那个区间,新的区间一定可以放进去。dp[i]表示前i个区间,第i个区间一定放入的最大权值和。先按开始时间进行排序。当start[i] >= end[j]时,dp[i] = max(dp[i],dp[j]+val原创 2015-03-14 12:07:08 · 471 阅读 · 0 评论 -
POJ2385 简单DP
题意 两棵苹果树,每一分钟某一颗树掉一个苹果,一个人接苹果,她每一次掉落苹果时只能在一棵树下等待。给你总时间T,人最多可以在两棵树间移动的次数W,还有每分钟是哪棵树掉苹果,问你她最多接多少个苹果。思路 dp(i,j,k)表示在前i分钟,最多移动j次,并且在i分钟站在第k棵下时最多接到的苹果数。a[i]表示i分钟时哪棵树掉。 状态转移 dp(i,j,a[i]) = max(dp(i-1,原创 2015-03-11 12:31:43 · 568 阅读 · 0 评论 -
POJ1386 有向图是否存在欧拉通路
#include #include #include #include using namespace std;const int maxm = 100005;const int maxn = 26;int n,m;int ru[maxn];int chu[maxn];int mapp[maxn];int fa[maxn];int ra[maxn];char str[10原创 2015-03-26 13:56:43 · 656 阅读 · 0 评论 -
POJ1565 水题
#include #include int main(){ char str[33]; while(scanf("%s",str)==1&&strcmp(str,"0")) { int len = strlen(str); int sum = 0; for(int i=0;i<len;i++) { sum += (int)(str[i]-'0') * ((1<原创 2015-03-13 07:22:01 · 555 阅读 · 0 评论 -
POJ2406 KMP next数组妙用
题意 一个串可以被几个相同的子串叠加形成~给你一个串,找到满足要求的最小子串,最后输出几个这样的子串可以构成原串~思路 假设该串可以被不是它本身的子串按题意产生。那么由next[n](n是字符串长度),一定会形成类似的样子: |_____|__|,中间的|表示next[n]位置。(1)如果后半的串可以被n整除,那么可以形成|___|___|___|___|类似的样子(每段标号1,2,3,4),原创 2015-03-23 01:34:01 · 417 阅读 · 0 评论 -
POJ2752 KMP next数组的活用
题意 给你一个串,找出它的所有子串,这些子串要求既是原串的前缀,也是原串的后缀思路 考察next数组的理解,对串中任意位置i来说,0~(next[i]-1)这个子串,是原串的一个前缀子串,同时它和(i - next[i])~(i-1)这个子串是相等的。因此令i = n,则通过next[n]可以找到一个满足题目要求的最长子串(除了原串外),然后迭代的去找这个最长子串满足条件的子串~注意:ne原创 2015-03-22 18:56:37 · 373 阅读 · 0 评论 -
POJ1742 多重背包 递推关系优化
题意 给你n种钱币,每种面值Ai,数量Ci,问你能凑成的不超过m的面值数量思路1 这是我起初的想法,优化了半天还是超时了...不过这里还是说一下,有些想法今后可能还会用到。 完全仿照多重背包的求解,把Ci拆分成一些2的次幂加和的形式,具体可参看背包九讲~但这样复杂度多出了一个logC,就会超时...然后我想m种面值不可能都达到,因此我每次只遍历已经达到了面值,然后更新出来的新值加原创 2015-03-18 10:52:59 · 773 阅读 · 0 评论 -
POJ1273 最大流模板题 初学网络流~
题意 不细说了,就是源是1,汇点是m的最大流模板思路 初学网络流,拿这题练练手。 总结下EdmondsKarp算法几个要注意的点: (1)算法本质就是利用BFS不停地找增广路,直到找不到为止。 (2)每次BFS后更新增广路时,一定注意减去或加上的都是最后Terminal得到流量。 (3)用连接表存的时候,为了原创 2015-03-12 18:38:05 · 722 阅读 · 0 评论 -
POJ3181 dp递推关系小优化 高精度数模板 Java练习
题意 给你n和m,问你用1...m这些数,每种无限个,相互组合,形成求和为n的方案数。思路 dp(i,j) 表示组成求和为i,且选用的这些数最小的要>j方案数。 转移:dp(i,j) = dp(i,j+1) + dp(i-j,j) 注意最后数会超long long 用高精度数。C++:#include #include #include #include原创 2015-04-02 16:27:10 · 437 阅读 · 0 评论 -
poj 1523 求无向图所有割点以及删除割点后连通分量个数 给出详细算法思路
题意无向图找出每个割点,然后求出删除这个割点所得的连通分量个数节点编号在1-1000,但没说按顺序给出思路无向图求所有割点是一类经典问题,这篇blog就以这题为例简单介绍一下求解的算法思路我们希望在O(n+m)的时间里求出所有的割点首先,总体思路是对图进行dfs操作,dfs的过程其实对应了一棵dfs搜索树,而我们就利用这棵搜索树的独特性质,来解决求割点的问题dfs过程是,当我们搜索到节原创 2017-09-25 22:07:03 · 1396 阅读 · 0 评论