其他算法题解
文章平均质量分 67
韩小侠
这个作者很懒,什么都没留下…
展开
-
HDU 2896 AC自动机
题意:给出多组模式串,再给出多组母串,输出存在于母串中模式串的编号。模板题,来试模板的。#include #include #include #include #include using namespace std;const int kind = 128;char str[10002],s[202];int virus[10],vcnt;struct node{原创 2013-08-07 18:40:12 · 643 阅读 · 0 评论 -
HDU 4302 MAP应用
题意:有一个动物在一条长为L的直线上,每次吃离他最近的东西,东西不断刷新,它也不短在吃,N次操作,问他走了多少距离,如有前后距离相同按照上一次走的方向吃。这题队友map过的,我map不熟,写了一下就当熟悉Map了,因为map内部有序,所以查询当前位置最近的两个点(一前一后),再定义一个方向标记就可以了。#include #include#include#include#includ原创 2013-05-23 16:08:35 · 698 阅读 · 0 评论 -
POJ 1704
这题好像nim博弈的变形 主要在于找到变成奇异局势的方式,那么可以想到最近的两个棋子移动到相邻 如果n为奇数那么把0点也看作是一个棋子 如果变完后那么后手只需要模仿先手就可以赢了 所以之前是nim博弈#include #include#include#includeusing namespace std;int main(){ int t,n,a[1010]; s原创 2013-02-26 11:24:19 · 535 阅读 · 0 评论 -
HDU 1848 SG函数
这题运用博弈中的SG函数解决的,感觉初级博弈题用这个很好用但是难一些的还是不会求SG值,就是SG的模板题。#include #include#include#includeusing namespace std;int k,fib[1000],f[10001];int mex1(int p){ int i,t; bool g[101]= {0}; for(原创 2013-02-26 09:42:07 · 640 阅读 · 0 评论 -
POJ 1014 DP
这题我用DP做的 并且记住一定不要先对2取模 我一开始对2取模果断WA后来发现 如果是3 0 1 0 0 0 这种情况是可分的但是如果提前对2取模变成1 0 1 0 0 0 这种情况那么就不可分了 还有待于提高啊 看到一个神剪枝 1-6的最小公倍数是60 每个数量对60取余就行了 至于为什么 我是根据利用扩展欧几里得解多元不定方程逆着想通的 不知道还有没有更好的证明方法#include #i原创 2013-01-25 13:46:41 · 492 阅读 · 0 评论 -
HDU 1730 尼姆博弈
这题就是尼姆博弈的变形 可以讲两子之间的序列看做是 一堆一堆的数 至少取一个 根据尼姆博弈的特点可知 如果是奇异局势的话 那么 (a1, a2, … , an)都有a1(+)a2(+)…(+)an =0#include #includeusing namespace std;int main(){ int n,m,a,b,ans,s; while(cin>>n>>原创 2013-01-09 14:13:08 · 519 阅读 · 0 评论 -
POJ 3211 Washing Clothes
题目大意:两个人同时洗一种颜色的衣服 洗完才能洗下一种颜色的衣服 求把所有种类的衣服洗完最少时间 题解:把每种颜色的衣服转化为必须装满的背包 求最接近每种颜色衣服总时间sum[i]/2的值即dp[mid]把sum-dp[mid]累加就是答案#include #includeusing namespace std;char color[12][21],temp[21]原创 2012-11-26 00:16:42 · 503 阅读 · 0 评论 -
HDU1285 拓扑排序
确定比赛名次 T ime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 637原创 2012-09-25 16:11:32 · 566 阅读 · 0 评论 -
STL stack应用
1. 概念 stack是一种LIFO(last-in first-out)的数据结构,其只允许在容器的尾部对数据进行操作,如下: stack定义如下: Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out),转载 2013-02-27 09:26:53 · 486 阅读 · 0 评论 -
POJ 2234 尼姆博奕
有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜.任何奇异局势(a1, a2, … , an)都有a1(+)a2(+)…(+)an=0. ( (+)为 按位与)#include #includeusing namespace std;int main(){ int n,m,sum; while(~scanf("%原创 2013-01-09 13:44:46 · 516 阅读 · 0 评论 -
POJ 2642 Charm Bracelet
题解:01背包的入门题 不知道为什么二维数组RE了 所以一维滚动数组可以A掉#include #include#includeusing namespace std;int dp[13000];int cost[13000],rating[13000];int main(){ int n,m; while(cin>>n>>m) {原创 2012-11-25 20:06:33 · 698 阅读 · 0 评论 -
HDU 4631 set维护
题意:给出n有n个点,每次插入计算最小点对距离,然后把距离和求出来。用multiset按x坐标大小维护就行了。14s #include #include#include#include#includeusing namespace std;struct point{ long long x,y; bool operator < (const point &m)原创 2013-08-02 10:53:43 · 734 阅读 · 0 评论 -
HDU 1228 模拟水题
字符串的水题 用了两种方法做的 感觉做法都很山寨 题目很水 如果不限制小于100会很好 #include #include#includeusing namespace std;int pd(string s){ if(s=="zero") return 0; if(s=="one") return 1; if(s=="two原创 2013-01-23 12:30:55 · 542 阅读 · 0 评论 -
HDU 4099 字典树+高精度
题意:给出某项斐波那契数的前几位,让输出最小的一项前缀为这个串的项数。先高精度算出前100000项斐波那契的前50位。并把前40位存进字典树预处理一下。字典树节点值存为第几项。然后输入字符串直接查找。#include #include#include#includeusing namespace std;#define N 50int fib[3][N+1];class tr原创 2013-07-19 15:22:21 · 996 阅读 · 0 评论 -
HDU1075 字典树
我用字典树写的 按照题意做就行 #include#include#includeusing namespace std;class trie{public: trie* next[26]; char str_temp[12]; int num; //记录前缀的个数 bool value; //标记这里是不是一个单词 tr原创 2012-11-26 00:33:26 · 560 阅读 · 0 评论 -
POJ 1976 A Mini Locomotive
题意:给出n车厢以及n节车厢内的人数 现有三节迷你火车头 每个火车头可以拉连续的m节车厢 问三个火车头最多可以拉多少人。dp[i][j]表示第i节车厢有j个车头可以拉的总人数 dp[i][j]=max(dp[i-1][j],dp[k][j-1]+a[i]-a[k]) k=max(i-m,0) 前一个表示该节车厢不拉 后一状态表示加一个火车头拉#include #include#incl原创 2013-12-20 13:25:02 · 924 阅读 · 0 评论 -
HDU2527 构建哈夫曼树的灵巧运用
上课老师说了知道哈夫曼树叶子 不构图求二叉树的权 就是在构造哈夫曼树的时候运用构图的方法 把每个结点的值加起来就是该数的权 证明 W=∑叶子权*该叶子层数 除了叶子的结点和就是这个树的权 构造一个树就知道了 结点的权 肯定是下一层结点的和 就好像 W=∑叶子权*该叶子层数 这个公式运用了乘法分配律一样= = #include #include#include#includ原创 2012-11-07 18:50:14 · 760 阅读 · 0 评论 -
HDU 2795 单点更新查询最大值
题意:给你一个h*w的广告板,每条通知的长度为1*wi,给出n个通知,如果可以放下尽量靠上放,对应的行里尽量靠左方,对于每条通知给出存放在哪条上。这题最多n个节点,所以不用考虑h的最大范围。线段树中每点维护当前剩余宽度,查询最大剩余宽度是否满足,满足即查询靠上的节点并更新。#include #include#include#includeusing namespace std;#原创 2013-05-20 17:14:26 · 733 阅读 · 0 评论 -
POJ 3468 线段树 区间更新区间查询
题意:给出一段数列,任意区间加上一个整数v,任意区间查询。给出N个数,Q次操作。线段树的题,延迟指针不更新到底就行了。#include #include#include#includeusing namespace std;#define maxn 100005long long sum[maxn<<2],col[maxn<<2];void build(int rt,int原创 2013-05-29 14:09:25 · 919 阅读 · 0 评论 -
HDU 4311 树状数组+二分
题意:给出10W个点,找出一个点使得每点按网格走到它的步数和最小,求最小步数和。每步这么走Eg: (x,y) can be reached from (x-1,y), (x+1,y), (x, y-1), (x, y+1).。a点到达b点的步数为abs(b.x-a.x)+abs(b.y-a.y) 那么a点到所有点的步数和为abs(pi.x-a.x)+abs(pi.y-ay)所以按照从小到大的顺原创 2013-06-01 12:35:15 · 760 阅读 · 0 评论 -
HDU 1698 线段树成段更新
题意:线段树成段更新,最后查询全区间。#include #include#include#includeusing namespace std;#define maxn 100005int node[maxn<<2],col[maxn<<2];void build(int rt,int l,int r){ col[rt]=0,node[rt]=1; if(l==原创 2013-05-29 11:01:14 · 643 阅读 · 0 评论 -
POJ 2828 单点更新
题意:给出N个人要查入队伍中的位置,按照输入的顺序,求最后队伍的先后顺序。先把输入存起来,从后往前插入,前一个序号就代表前面有几个人,线段树内记录当前位置是否被占了,找低Num+1个空位坐下就行,查询函数返回空总和为num+1的位置。#include #include#include#includeusing namespace std;#define lson l,m,rt<<原创 2013-05-21 15:42:18 · 668 阅读 · 0 评论 -
HDU 1394 线段树单点更新求逆序数
题意:给出含有0 ~n-1 N个数组成的序列,有N次操作,每次把第一个数放到数列的最后,问这几次数列操作中最小的逆序数的值。单点更新就可以,每一输入一个数,先查询有几个比这个数大的,再将这个值插入线段树中。#include #include#include#includeusing namespace std;#define N 5005struct node{ i原创 2013-05-20 10:40:13 · 794 阅读 · 0 评论 -
HDU 2642 二维树状数组
题意很明确 给你一个图某坐标上的星星亮 暗 条件 求出当前区间内所有亮星星的总数 #include #include#includeusing namespace std;const int maxn = 1005;int tree[maxn + 2][maxn + 2];inline int Lowbit(int x){ return x&(-x);}inline原创 2013-01-31 17:12:12 · 586 阅读 · 0 评论 -
HDU 4305 无向连通图的生成树个数 矩阵行列式取模
题意:给出n个人和他们的坐标,闪电随机劈到一个机器人,在他周围的与他距离不超过r的机器人会被传播,但是三点共线的情况只能传染最近的那个,传染后的有多少种情况。也就是无相连通图的生成树的个数。对于一个无向连通图来说,它可能有很多生成树,那么如何求得它的生成树个数呢?首先给出一个非常一般的计算方法 -- 矩阵行列式法对于任何一个顶点数为n的无向连通图,我们列出一个矩阵。原创 2013-05-29 09:26:23 · 1643 阅读 · 0 评论 -
POJ 2421 最小生成树
题意:给出每两个城市间建路的花费和已经拥有的路,求最小花费让图连通。最小生成树。。#include #include#include#includeusing namespace std;const int maxv=105,maxe=10005;struct node{ int w,to,next,f;} e[maxe];int head[maxv],dis[m原创 2013-08-19 11:37:03 · 720 阅读 · 0 评论 -
HDU 3065 AC自动机
题意:给出大写字母组成的模式串,再给出一个字串匹配,问每个模式串在母串中出现的次数,母串为可见字符ASCII。#include #include#include#include#includeusing namespace std;const int kind = 28;int num[1005];char str[2000002],key[1002][55];struct原创 2013-08-08 10:42:22 · 634 阅读 · 0 评论 -
HDU 2222 AC自动机
题意:给出多组模式串,再给出一个母串,问多少模式串是母串的字串。裸AC自动机题,来试模板的。#include #include#include#include#includeusing namespace std;char key[55],des[1000005];const int MAX_NODE = 1000005;const int SIGMA_SIZE = 26;原创 2013-08-07 13:27:24 · 649 阅读 · 0 评论 -
HDU 4300 暴力水过
题意:给出一个26位的字母对照表,再给一段密文+明文(密文按照对照表翻译好的)的字符串,前面是明文后面是密文,而且密文一定完整明文可能不完整。让你把密文还原,还有个条件是密文尽可能短的,先输出密文输出明文。因为密文完整明文可能不完整所以最短的情况也就行一半密文一半明文了,所以就先把这段文字按照表翻译成明文,在从头与给出的字符串的后半部分比较,对上了就说明是原串在这之前的部分是密文。qwer原创 2013-05-23 16:22:39 · 871 阅读 · 0 评论 -
HDU 4666 STL求多维最远曼哈顿距离
题意: 有Q个操作。 没次操作会增加一个点, 或者删除一个点。 每次输出点集的最大曼哈顿距离。思路: STL应用一维就是 Max (x) - Min(x)就是对于 二维的 x - y 和 x + y 做两个集合。 答案肯定会在 Max( x - y) - Min( x - y) 或者 是 Max(x + y) - Min(x + y)而三维就是 Max(x +原创 2013-08-14 11:34:04 · 880 阅读 · 0 评论 -
POJ 1745DP
题解:看了题觉得没什么思路 觉得如果一步一步推肯定超空间了 然后我看了黄学长的博客 啊 用两个数组来回推就行了 太巧妙了 太弱了我 哎 还是做题不够 学长真是猛。。。#include #include#includeusing namespace std;#define get(x) ((x)<0?(-(x))%k:(x)%k)bool dp[2][105];int yl[10原创 2012-12-05 13:36:21 · 591 阅读 · 0 评论 -
HDU 4341 判断共线+背包
题意:黄金矿工的意思,每个点有价值和时间,如果共线得从最近的开始取,问求时间t內取到的最大价值。这题把共线的情况看成一组,要取某个点的话必须把跟这个点共线并且与原点距离在这个点之前的点取到。所以把每条线上的分组用分组背包就可以了。#include #include#include#include#includeusing namespace std;struct point{原创 2013-06-26 09:58:57 · 1093 阅读 · 0 评论 -
HDU1709 DP
这题就是问给你各种重量砝码各一个 问能称多重的东西 这里可以两面同时放砝码 所以第二个样例出现4 5 两种情况这题用DP 母函数都可以 只不过要考虑两个天平都有砝码也就是相减的情况 我是用DP做的 所以开了一个滚动数组看代码吧#include #include#includeusing namespace std;int get(int x){ return x>=0原创 2012-12-30 15:55:32 · 556 阅读 · 0 评论 -
HDU4292 网络流 2012 ACM/ICPC Asia Regional Chengdu Online1005
Food Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi原创 2012-09-18 17:54:21 · 1097 阅读 · 0 评论 -
HDU 1892 二维树状数组
题意给的操作讲的很明白 注意不能出现负数 坐标值可能为0 两个坐标大小不能确定 #include #include#includeusing namespace std;const int maxn = 1002;int tree[maxn + 2][maxn + 2];int n;inline int Lowbit(int x){ return x&(-x);}i原创 2013-01-31 16:02:50 · 535 阅读 · 0 评论 -
HDU 4308 BFS
题意:给出一个迷宫,王子的位置公主的位置,剩下的是,墙#、收费站*和传送点P。每过一次传送点需要付费cost。问你王子救到公主的最小花费。这题用广搜就行,因为没有空白的点,从Y开始如果遇到p就把所有传送点送进队里就可以了。#include #include#include#include#includeusing namespace std;char map[5005][500原创 2013-05-28 13:58:32 · 688 阅读 · 0 评论 -
POJ 3628 Bookshelf 2
题解:01背包 恰好装满的问题 初始化的时候除了DP[0] 外全部设为不可到达 然后依次累加最后得出结果#include #include#includeusing namespace std;bool dp[20000005];int main(){ int h[22],n,m; while(cin>>n>>m) { i原创 2012-11-25 21:30:18 · 496 阅读 · 0 评论 -
HDU1171 DP
这题老师上课说用母函数做 想了一会 还是DP吧 开了个DP标记数组 求完各个组合的值就行了力求代码简洁= = 向学长学习#include #include#includeusing namespace std;bool dp[3000000];int main(){ int value,n,num,sum,a; while(~scanf("%d",&n)&&(n原创 2012-12-28 21:16:33 · 629 阅读 · 0 评论 -
HDU1398 DP
这题用母函数或者DP都可以 我用DP做的 感觉还是DP还是熟练一些 开一个标记数组 一个答案数组 如果标记数组的值为真 那么就证明有一种硬币排列出j的值 那么从j再往上加i*i 的同时更新ans dp 就行了 用脑子模拟一下就可以了 #include #include#includeusing namespace std;bool dp[310];int ans[310];in原创 2012-12-30 14:24:13 · 785 阅读 · 0 评论 -
HDU 1166 线段树单点更新
第一行一个整数T,表示有T组数据。每组数据第一行一个正整数N(N接下来每行有一条命令,命令有4种形式:(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);(3)Query i j ,i和j为正整数,i(4)End 表示结束,这条命令在每组数据最后出现;每组数原创 2013-05-15 20:55:48 · 634 阅读 · 0 评论