
acm算法
文章平均质量分 57
whiker
这个作者很懒,什么都没留下…
展开
-
2020-09-16
【算法题】算数运算题面描述:给定字符串,其中包含分数、小括号、中括号、大括号、加减乘除,给出结果且结果若为分数,输出分数;若为整数,输出整数。涉及知识点:最小公约数#include <string>#include <algorithm>#include <iostream>#include <vector>#include <map>#include <set>#include <stack>#原创 2020-09-16 19:29:20 · 186 阅读 · 0 评论 -
poj 3280 判断得到回文串的时候最小花费
题意:判断得到回文串的时候最小花费,去掉或加上某一个字母时都有一个花费。题解:对于某一个字符串as......sf,使其变成回文串时策略就是 对于已经形成回文串的s......s,1->去掉a,变成s..........sf2->在后面加上a,变成as......sfa3->去掉f 4->在首加上fdp[i][j]代表从i到j变成回文串需要的最小代价。dp[i]原创 2013-04-16 21:52:01 · 967 阅读 · 0 评论 -
hdu 1028 母函数 模版题
母函数详解 http://www.wutianqi.com/?p=596第二种:求用1分、2分、3分的邮票贴出不同数值的方案数:大家把这种情况和第一种比较有何区别?第一种每种是一个,而这里每种是无限的。看这个题,当邮票为两分时,就是(1+x^2+x^4+x^6+x^8+.......) 因为是无限多个当邮票为四分时 (1+x^4+x^8+x^12.....)所以当有原创 2013-04-14 20:42:50 · 771 阅读 · 0 评论 -
poj 3140 树型DP
题意:一颗树,去掉某条边,使得剩下的两部分差值最小。问最小差值是多少题解:sum数组存储该节点及其子树的和。深搜一次算出sum,再枚举一次,得到最小差值。注意此题的long long#include#include#includeusing namespace std;long long sum1,n,m,value[100010],list[100010],sum[100原创 2012-12-05 13:44:59 · 402 阅读 · 0 评论 -
zoj 3329 概率dp 求期望
看到网上 http://blog.youkuaiyun.com/morgan_xww/article/details/6775853 写的真的好厉害。。我都能看懂。。膜拜一下dp求期望的题。 题意: 有三个均匀的骰子,分别有k1,k2,k3个面,初始分数是0, 当掷三个骰子的点数分别为a,b,c的时候,分数清零,否则分数加上三个骰子的点数和, 当分数>n的时候结束。求需要掷骰子的次数的原创 2012-12-13 11:07:38 · 490 阅读 · 0 评论 -
codeforce 168#div2 B题
题意 n*m的格子,有些被涂黑了。问能不能从这些黑的中,一笔画连起来并且只转向一次。暴力枚举:把这些黑格子记录下来,从第一个到最后一个一一枚举到其他格子的 曼哈顿路。如果不存在曼哈顿路,那么就false,输出no。如果能,继续枚举遍历。for(int i=0;i<sum;i++){ for(int j=i+1;j<sum&&flag;j++){//遍历 从头到尾。 }}原创 2013-03-20 22:13:04 · 799 阅读 · 0 评论 -
poj 3680 最小费用流
题意:n个区间,每个区间都有权值,尽可能的去取区间,但要保证每个点不被取超过k次。题解:主要就是建图:我是不会建。。我太笨了。首先,我们不可能每个点使其都存在。太多了。所以我们就取每个区间的端点。这样,每个端点之间的流量为k,费用为权值。但是,为了确保我们不想取这个区间时有别的选择,就把所有的点从小到大 连起来,流量为k,为用为0。这样当我们不想取某个区间时,就从费用为零的边上流过就行原创 2012-10-22 20:11:25 · 395 阅读 · 0 评论 -
codeforces Round #146(div2) B.Easy Number Challenge
这道题很有意思,给你三个数a b c,让你(1~a)*( 1~b)*( 1~c),然后这个数有几个因子,把所有的因子个数相加输出。 一开始WY的思想是:把一百以内的素数求出来,然后三重循环,每次i*j*k求其素数因子个数再+1,相乘就是这个数的因子个数。#include#includeint a,b,c;int main(){ int prime[100],p[200],n原创 2012-10-23 18:41:22 · 882 阅读 · 0 评论 -
poj 3436 网络流
纠结了好久的题,必须要拆点,但是有个不拆点也能A的代码。可是这组样例告诉我们必须拆点:2 410 0 0 0 110 0 0 0 010 0 1 1 110 0 1 1 1不拆点的代码:(AC了 但是是错的)点与点之间的权值为min(i,j的容量)#include#include#define MX 1000000int n,p,map原创 2012-09-08 20:00:43 · 594 阅读 · 0 评论 -
poj 1815 最小点割转化为最小边割+枚举 (邻接矩阵+递归dinic)
题意就是去掉几个点,是VS与VT不连通。并问去掉了哪几个点?。本来是最小点割的,但要转化成最小边割,就是拆点,把点变成边就行了。容量为1 。其他点相连时权值为MX。求一次最大流,若为MX,那么就证明VS与VT直接相连了,NO ANSWER!若不为MX,那么从第一个点枚举,去掉这个点,即i到i+n边容量从1边为0 。初始流量。求次最大流看看流量改没改变,若改变了,那么就说明此点是我们要找原创 2012-09-22 21:16:22 · 819 阅读 · 0 评论 -
poj 3268 dijkstra
题意: n个点,m条边,终点为x,问从某点到x,再回来,最大权值和为多少。题解: 正图一次从x点开始的dijkstra,再来个反图,从x点开始的dijkstra。把两个dist数组加和找最大。#include#define MX 111111111int map[1010][1010],mapcopy[1010][1010],dist1[1010],dis原创 2012-08-21 17:50:28 · 360 阅读 · 0 评论 -
poj 1860 bellman-ford
题意: 兑换货币,给你初始货币,看看你兑换完能不能比初始货币多。这真不要脸。。。有这好事我也去换了。。T,T题解: 建个点0,从点0指向初始货币。bellman负权回路反用,也就是找正权回路就行。#includestruct point{ int u,v; double w,r,c;}eg[11000];int n,m,s;double V,dist[1原创 2012-08-23 10:57:30 · 382 阅读 · 0 评论 -
poj 1932 bellman
我真的很水。。。代码写的丑不说。。。思想也跟不上。。。哎。。努力爬呀努力爬。。题意:she从1到n能不能走到,每个房间都有能量值,有正有负,如果能量为0或从1到n没有通路。就hopeless。否则winnable。题解:先用floyd 算出图的关系,即i 能不能到达 j。然后在bellman 若图中存在正回路并且能通过此点到达n 也是可以的。#inclu原创 2012-08-23 15:02:25 · 359 阅读 · 0 评论 -
poj 2240 bellman-ford
题意: 货币转换,看一圈下来有没有货币能够升值。。。题解: 仍需要floyd来算关系。bellman来看有没有正权值回路并通过此点能够到达v0.#include#includestruct point{ int u,v; double w;}eg[1100];int cas=1,k,pos,n,m,map[50][50];double dis原创 2012-08-23 16:21:55 · 330 阅读 · 0 评论 -
CF 270D 最长不下降子序列 优化
n个数,每个数属于m个种类中的一种。要求将这n个数重排列,使其种类为1到m这样排列。用最小次数的移动方式。求出这个数列的最大不下降子序列,用n减去这个子序列数。#include#include#include#includeusing namespace std;#define MAXN 5001int s[MAXN],d[MAXN],a[MAXN]原创 2014-03-24 13:32:36 · 676 阅读 · 0 评论 -
hdu 1004 map初运用。。。
#include#include#include#includeusing namespace std;int main(){ int n,cas=1; while(scanf("%d",&n)&&n){ map s; string ss; char S[1111]; for(int i=1;i<=n;i++){ scanf("%s",S); s[S原创 2013-04-02 18:01:25 · 668 阅读 · 0 评论 -
hdu 3400 三分嵌套
三分 这里写的很详细 http://hi.baidu.com/vfxupdpaipbcpuq/item/81b21d1910ea729c99ce33db题意 AB、CD两条线上速度为p和 q 其他地方速度为r 问A到D最少时间是多少题解:那么路程必定是 经过AB上某一点在经过CD上某一点到达D ,那么如何去找这两点就是我们要解决的。我们发现,除了AB 和CD上这两点,其他点原创 2013-03-31 13:49:00 · 673 阅读 · 0 评论 -
hdu 1011 树型dp+背包
#include#include#includeusing namespace std;int pos,n,m,list[200],bug[200],brain[200],dp[200][200];struct P{ int u,v,next;}point[1000];void add(int u,int v){ point[pos].u=u; point[p原创 2012-12-08 21:45:22 · 435 阅读 · 0 评论 -
hdu 3695 ac自动机
n个子串,一个母串,问有多少个子串在母串中出现,包括被反转的子串。只要把母串正着反着各自匹配一遍就行。同样用的hdu 2222的模版#include#include#includeusing namespace std;struct node{ int num; node *next[26],*fail; node(){ num=0; fail=NUL原创 2013-03-28 20:59:58 · 709 阅读 · 0 评论 -
poj 1384完全背包
题意:给你一个e和f,其实f-e就是背包的容量,然后给你很多钟钱币的值以及花费,问你能不能把这个容量正好填满,并且价值最小。题解:对数组初始化的时候除了0容量为0以外,其它的容量都为MAX,那么状态转移方程为f[i][v]=min{f[i-1][v],f[i-1][v-cost[i]]+w[i]};就行了。最后看看v[背包容量]是不是MAX,如果是,代表不可能被正好填满。#incl原创 2012-11-26 21:37:22 · 448 阅读 · 0 评论 -
poj 2923 状态压缩 + 01背包
题意: 两个车有容量a与b,n个物品,每个物品有一个体积,问最小多少次能够运完他们。因为n先进行遍历,看看1然后用it数组,代表物品,进行背包 j代表状态,j&it[i]时,代表两个状态不冲突,就是存在某个物品运了两次。j|it[i]代表当前状态。#include#include#define Max 10000000int it[2000],dp[2000],原创 2012-11-29 10:54:40 · 894 阅读 · 1 评论 -
poj 1276 多重背包
给你一个cash,n种钱,每种钱的数量及价值,问最大接近cash凑成多少。就是多重背包。#include#include#includeusing namespace std;int cash,n,numb[20],value[20],dp[1000000];void complete(int cost){ for(int j=cost;j<=cash;j++){原创 2012-12-01 11:10:08 · 340 阅读 · 0 评论 -
poj 1787 多重背包+路径记录
4种钱币,价值是1 5 10 25,给你他们的个数,问能不能用最多的钱币到达p,如果能输出每种的个数,不能输出不能。。开个numb二维数组记录路径。#include#include#includeusing namespace std;int numb[11000][4],dp[20000],ci[4],p,wi[4];void complete(int cost,int i原创 2012-12-01 21:29:08 · 968 阅读 · 0 评论 -
poj 2828 线段树
几个人,插队题。n个人,每个人两个值。pos代表此人插在第pos个人的右边,value值代表此人所持有的值。最后问是怎样个队列。从后往前看这个队列,i个人前边一定会有pos个人。 这样线段树维护的就是此区间有多少个空位。#include#includeint tree[1000000],n,que[10000000];struct People{ int原创 2012-11-12 21:41:53 · 412 阅读 · 0 评论 -
poj 1273 网络流
裸的网络流,注意有重边就行。比如 dicuss上的一组数据,结果应为15:3 21 2 41 2 51 2 6#include#include#define MX 10000000int n,m,c[205][205],f[205][205],pre[205],mf[205],q[205];int main(){ while(scanf("%d%d"原创 2012-09-02 10:58:07 · 438 阅读 · 0 评论 -
poj 1207 水题
很水,注意i j大小要自己判断#includeint num,i,j;int main(){ while (scanf("%d%d",&i,&j)!=EOF) { int max=0; int i1=i,j1=j; if(i>j) { int c=i; i=j; j=c; } for(int num1=i;num1<=j;num1++原创 2012-09-04 13:48:56 · 490 阅读 · 0 评论 -
poj 1250 水题
。。。。某大叔说我写的代码很难看,囧了,还特意找了篇文章让我膜拜。还是个全英文的,更囧了,好吧,让我一点一点纠正我的习惯吧。#include#includechar s[1000];int ss[30],num;int main(){ while(scanf("%d%s",&num,s)&&num) { memset(ss,0,sizeof(ss)); int l原创 2012-09-04 15:17:30 · 493 阅读 · 0 评论 -
poj 1087 网络流
仍是最大流。map很好用啊,自己写的change函数就TLE了,直接拿map来映射就行。。。转换器之间边权值为MX。VS到用电器之间权值为1,用电器到插头之间权值为1,提供的插座到VT之间权值为1.#include#include#include#include#define MX 100000using namespace std;int h,n1,n2,原创 2012-09-09 17:24:23 · 506 阅读 · 0 评论 -
poj 1637 最大流(混合图欧拉回路)
。。。。对拍了好久,对出个300多个遍的bug,正在纠结要不要看的时候。。突然发现。。哪错了。。边权是1 。。但你也不能就赋1啊。。你个白痴T,T。。对于无向边,随便定向,然后看看每个点的出入度之差是不是偶数,如果有不是的那就不是欧拉图了,如果都是,那么对于之差为偶的点,改变x/2 (x为出入度之差)条边,如果是满流,那么就能变成欧拉回路。如果不是满流,就不能变成欧拉回路。建图:将原创 2012-09-10 21:37:53 · 2158 阅读 · 0 评论 -
最短路 SPFA (对于bellman-ford 的优化)
SPFA算法: 既然是优化,那么肯定也不可能在图中出现负权值回路。 主要就是运用队列,如果一个点的信息被改变了,那么就把他加入队列,把队列中 点与此点相关的边 所连接的点的信息更新。直到队列为空。code:时间复杂度 O(km) k为平均每点如队列次数#include#include#includeusing na原创 2012-08-16 20:48:46 · 336 阅读 · 0 评论 -
poj 1364 SPFA+差分约束
约束条件:如果是gt s[a-1]-s[a+b]如果是lt s[a+b]-s[a-1]此外,新加的原点与其他点的leth为零。n+1为原点。#include#include#define MX 10000000int n,m,dist[110],vst[110],list[110],f[1000000];char ss[5];bool visit原创 2012-08-26 14:04:12 · 350 阅读 · 0 评论 -
hdu 1878 欧拉回路
判断是否存在欧拉回路,主要是还要判断图是否连通。#include#includeint point[1010],pre[1010];struct p{ int u,v;}eg[10010];int find(int root){ int now,w=root; while(pre[root]!=root) root=pre[root]; while(pre[w原创 2012-08-27 19:46:51 · 2914 阅读 · 0 评论 -
poj 2253 最小生成树 kruskal
题意: 小青蛙(A)找女朋友(B)。途中有好多石头。你就跳吧。。。因此A到B有很多个路径。找这些路径中最短的一条。并把这条路径中两个石头距离最大的那段输出。题解: kruskal就行 #include#include#includeusing namespace std;int pre[210];struct point1{原创 2012-08-14 20:24:18 · 437 阅读 · 0 评论 -
poj 1056 字典树水题
刚刚做出来的昨晚看的模板,第一次看懂了什么是字典树。。汗了,从一开始的结构体定义都不知道。。到现在A过了一题,嘿嘿,挺高兴的写一下我的理解吧。 主要就是建立一堆一样的结构体,以ROOT为原点,*NEXT【10】为分支联络员,连接着OTHER们,如果输入的S字符串中的数没有建立,那就加一个OTHER【num++】为NEXT【数】的成员,最后再在END上画下true,表示结束。原创 2012-08-14 15:40:37 · 502 阅读 · 0 评论 -
队列
#includequeueq; //此处类型可以为结构体 Q=q.empty() 若队列q为空返回true,否则为falsee=q.front() 用e返回q的队头q.push(e)插入元素e为q的新队尾q.pop()删除q的队头元素 //另 结构体可以定义为二维的;原创 2012-08-14 15:37:41 · 234 阅读 · 0 评论 -
二分匹配 点独立集数=n-匹配数
男女有的有喜欢的关系,有的没有,找出一个最大集合,使集合中任何两个学生都没有关系。sample in70: (3) 4 5 61: (2) 4 62: (0)3: (0)4: (2) 0 15: (1) 06: (2) 0 1sample out5此外,输入还可以这样输入啊。。。scanf("%d: (%d)",&u,&k);原创 2013-06-09 21:07:24 · 736 阅读 · 0 评论 -
校oj1085 计算从左下到右上有多少不同走法
给出一个n*m的矩阵,每次从左下走到右上,共有多少种不同走法。一开始思考,用二层循环遍历一边,但是果断TLE。正解:每次走n+m步,每一步要么是往上走,要么是往右走,所以就相当于在n+m中挑出n步走上.就变成组合数学题了 C(n+m)m或者是C(n+m)n 应该取最小,这样就能省不少时间。C(n+m)min{n,m}如何快速算 Cnm呢double原创 2013-05-17 17:41:41 · 884 阅读 · 0 评论 -
hdu 4472 dp
n个人,每个人都有上司,除了第一个人,要求同一级别的人他们的下属是一样多的。比如问给出你人数,有多少种情况。dp[i]代表当有i个人时有多少种情况。那么从第一个人开始往后推,如果i-1能被j除尽(代表i个人减去大boss后被分成(i-1)/j份,每份j个人),那就dp[i]+=dp[j];#include#include#include#include原创 2013-04-11 22:06:10 · 721 阅读 · 0 评论 -
codeforce 176#div.2 C
题意: Ppi=n-i+1. p为一个序列,求这个p序列。不存在输出-1. 经验算,我们可以发现 Ppi (i 为 1~n)对应的值为n~1. 所以 我们设 p1里的数 为x,那么px里的数 就为 n,pn里的数为 y,py里的数为1. 这样就是一个环了。 如果整个数列存在偶数个环,那么这个序列就存在了。当然,如果n为奇数,那么中间那个数自己就是一个环。剩下的就是把环两两配对。配原创 2013-03-23 21:41:13 · 807 阅读 · 0 评论 -
hdu 3586树型DP
依旧。。不会。。二分,因为题中说要找到代价和小于m并且输出那个代价和中最大的边,就要用到二分了。对每个边判断其实否小于二分中mid的值(也就是limit)状态转移方程:if(w[j与其孩子的边的代价] else dp[j]+=dp[j的孩子];#include#include#include#define Max原创 2012-12-04 11:30:33 · 421 阅读 · 0 评论