POJ1416 Shredding Company(dfs)
摘要:题目链接。分析:这题从早上调到现在。也不算太麻烦,细节吧。每个数字都只有两种状态,加入前一序列和不加入前一序列。DFS枚举。#include #include #include #include #include #include #include #include using namespace std;int ord[10], len, ans_a[10], tar, max_ans, cnt;char s[10];bool flag;void dfs(int cur_s, int cur_t, int cur) { if(cur_s+cur_t > tar) { //...
阅读全文
posted @
2013-08-23 15:05
Still_Raining
阅读(207)
推荐(0)
POJ2002 Squares(枚举)
摘要:题目链接。分析:普遍的做法是:先枚举两个点,通过数学公式得到另外2个点,使得这四个点能够成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。但这种做法会使同一个正方形按照不同的顺序被枚举了四次,因此最后的结果要除以4.已知: (x1,y1) (x2,y2)则: x3=x1+(y1-y2) y3= y1-(x1-x2)x4=x2+(y1-y2) y4= y2-(x1-x2)或x3=x1-(y1-y2) y3= y1+(x1-x2)x4=x2-(y1-y2) y4= y2+(x1-x2)直接hash太麻烦,使用set简单些.AC代码如下:#include #includ
阅读全文
posted @
2013-08-21 17:06
Still_Raining
阅读(398)
推荐(0)
POJ3087 Shuffle'm Up(模拟)
摘要:题目链接。AC代码如下;#include #include #include #include #include #include #include #include #include #include using namespace std;const int maxn = 1000+10;int main() { int T, n, cn; bool flag; char s1[maxn], s2[maxn], s3[maxn], s[maxn]; scanf("%d", &T); for(int kase=1; kase st; cn...
阅读全文
posted @
2013-08-21 10:05
Still_Raining
阅读(218)
推荐(0)
POJ3126 Prime Path(BFS)
摘要:题目链接。AC代码如下:#include #include #include #include #include #include #include #include #include using namespace std;const int maxn = 10000;struct node { int x, s;};int end;bool vis[maxn], prime[maxn];int BFS(int s) { if(s == end) return 0; queue Q; memset(vis, 0, sizeof(vis)); vi...
阅读全文
posted @
2013-08-20 21:10
Still_Raining
阅读(1016)
推荐(0)
POJ2442 Sequence
摘要:题目链接。#include #include #include #include #include #include #include using namespace std;const int maxn = 2000+10;int a[maxn], b[maxn];int main() { int T, n, m; scanf("%d", &T); while(T--) { priority_queue que; scanf("%d %d", &n, &m); for(int i=0; i que.top()...
阅读全文
posted @
2013-08-20 10:36
Still_Raining
阅读(225)
推荐(0)
HDU4681 String(dp)
摘要:题目链接。#include #include #include #include #include using namespace std;const int maxn = 1000+10;char s1[maxn], s2[maxn], s3[maxn];int dp1[maxn][maxn], dp2[maxn][maxn];int que1[maxn][2], que2[maxn][2];void max_dp(char *s1, char *s2, int (*dp)[maxn]) { int len1 = strlen(s1), len2 = strlen(s2); fo...
阅读全文
posted @
2013-08-19 17:07
Still_Raining
阅读(224)
推荐(0)
HDU4666 Hyperspace(曼哈顿)
摘要:题目链接。分析:这是多校的一个题,当时没做出来。学长说让用multiset。用multiset将每一个数的1#include #include #include #include #include #include using namespace std;const int maxn = 60000+10;const int dem = 5; //维数const int INF = (1 ms[40]; multiset::iterator it; for(int i=1; i>= 1; } ...
阅读全文
posted @
2013-08-15 10:46
Still_Raining
阅读(277)
推荐(0)
POJ3436 ACM Computer Factory(最大流)
摘要:题目链接。分析:题意很难懂。大体是这样的:给每个点的具体情况,1.容量 2。进入状态 3.出去状态。求最大流。因为有很多点,所以如果一个点的出去状态满足另一个点的进入状态,则这两个点可以连一条边。容量为两者容量的较小值。再建立一个超源、一个超汇。让超源与所有进入状态全为0或者不全为0但只包含0和2的点连边,同时让所有出去状态全部为1的与超汇连边。然后求最大流.#include #include #include #include using namespace std;const int maxn = 60;const int INF = (1 q; int p[maxn], a[max...
阅读全文
posted @
2013-08-14 11:28
Still_Raining
阅读(745)
推荐(0)
POJPower Network (最大流)
摘要:题目链接。分析:这题描述的可不是一般的复杂.其时就是很多源点、很多汇点,使尽量多流量的到达汇点。因为有很多源点,就再设一个源点(0号),使得0号到其它源点的容量为其它源点的初始量,同样设一汇点(n+1),使得其它汇点到该汇点的容量为其它汇点的初始量,如此就把很多的源点和汇点看成普通的点,单源单汇最大流。最大流用的是白书上的增广路算法。AC代码如下:#include #include #include #include #include using namespace std;const int maxn = 110;const int INF = (1 q; memset(flow, 0...
阅读全文
posted @
2013-08-13 16:05
Still_Raining
阅读(421)
推荐(0)
POJSorting It All Out (拓扑)
摘要:题目链接。题目大意:给定一定的数量的小于关系:1.如果发现环,输出从前几次就可以确定出现环2.如果能够确定唯一序列,输出。3.如果通过全部关系,还不能确定序列,则输出不能确定.分析:个人感觉难点在于判环上。1.如果每次都只能找到1个入度为0的点,并能确定序列,则该序列即为答案。2.如果每次查找时,发现两个及其以上的入度为0的点,则表明一定不能确定唯一序列(即存在环或者是不能确定)。如果可以确定一个任意序列,即表明还需要更多关系。如果继续查找下去,找不到入度为0的点,则存在环。 AC代码如下:#include #include #include #include #include using n
阅读全文
posted @
2013-08-12 23:38
Still_Raining
阅读(312)
推荐(0)
POJ3026 Borg Maze(最小生成树)
摘要:题目链接。题目大意:任意两点(点表示字母)可以连线,求使所有点连通,且权值和最小。分析:第一感觉使3维的BFS。但写着写着,发现不对。应当用最小生成树解法。把每个字母(即A,或S)看成一个结点,如果求出来任意两个结点间的权值,则求解即为求最小生成树。通过暴力,对每一个字母进行BFS,求出任意两个结点的距离。然后prim.AC代码如下:#include #include #include #include #include using namespace std;const int maxn = 52;const int INF = (1 Q; memset(vis, 0, sizeof(...
阅读全文
posted @
2013-08-12 16:49
Still_Raining
阅读(1256)
推荐(0)
POJ1789 Truck History(prim)
摘要:题目链接。分析:最大的敌人果然不是别人,就是她(英语)。每种代表车型的串,他们的distance就是串中不同字符的个数,要求算出所有串的distance's 最小 sum。AC代码如下:#include #include #include #include using namespace std;const int maxn = 2200;const int INF = (1= d[y]) m = d[x=y]; ans += m; vis[x] = true; for(int y=0; y G[x][y]) d[y] = G[x][y]; } ...
阅读全文
posted @
2013-08-12 10:31
Still_Raining
阅读(200)
推荐(0)
POJ3267 The Cow Lexicon(dp)
摘要:题目链接。分析:dp[i]表示母串从第i位起始的后缀所对应的最少去掉字母数。dp[i] = min(dp[i+res]+res-strlen(pa[j]));其中res 为从第 i 位开始匹配 pa[j] 所需要的长度。以下代码当做指针的练习,研究了几天C,发现C语言功底到底是提升了(虽说算法功底至今还木有)。#include #include #include #include using namespace std;const int maxn = 500;char s[maxn], pa[610][30];int dp[maxn];int match(char *s1, char *s2
阅读全文
posted @
2013-08-12 09:46
Still_Raining
阅读(237)
推荐(0)
POJ1125 Stockbroker Grapevine(最短路)
摘要:题目链接。分析:手感不错,1A。直接穷举的起点, 求出不同起点到其它点最短路中最长的一条的最小值(好绕)。#include #include #include using namespace std;const int maxn = 100+20;const int INF = (1= d[y]) m = d[x=y]; vis[x] = true; for(int y=0; y d[x]+G[x][y]) { d[y] = d[x] + G[x][y]; } } int ans = -1; for(int i=...
阅读全文
posted @
2013-08-09 17:29
Still_Raining
阅读(800)
推荐(0)
POJ1860 Currency Exchange(最短路)
摘要:题目链接。分析:以前没做出来,今天看了一遍题竟然直接A了。出乎意料。大意是这样,给定不同的金币的编号,以及他们之间的汇率、手续费,求有没有可能通过不断转换而盈利。直接用Bellman-ford检测负环的方法检测。#include #include #include using namespace std;const int maxn = 300;const int inf = (1d[e.v]) { d[e.v] = (d[e.u]-e.c)*e.r; } } } for(int i=0; id[e.v]) { ...
阅读全文
posted @
2013-08-09 16:17
Still_Raining
阅读(201)
推荐(0)
POJ1942 Paths on a Grid(组合)
摘要:题目链接。分析:#include #include #include #include using namespace std;typedef unsigned long long LL;int main() { LL n, m; while(cin >> n >> m) { if(n == 0 && m == 0) break; LL s = n+m; if(n > m) swap(n, m); LL ans = 1; for(LL i=s, j=1; j<=n; i--, j++) { ...
阅读全文
posted @
2013-08-07 16:20
Still_Raining
阅读(180)
推荐(0)
POJ2676 Sudoku(dfs)
摘要:题目链接。题目大意:就是数独游戏。横竖,每一个9宫方块,必须有1~9,且不重复。分析:直接DFS。一开始在原图上搜,会TLE。把要补全的空格,放入数组,这样就不用遍历整个图寻找要填的空格了。row, col, sq分别标记行,列,3*3方格是否重复。话说,直接做有人说反着搜(正着搜的意思就是从0~cnt-1,反着搜就是从cnt~0),试了试。AC代码如下:#include #include #include #include using namespace std;struct node { int x, y;}q[9*9+10];bool row[10][10], col[10][10...
阅读全文
posted @
2013-08-07 14:39
Still_Raining
阅读(968)
推荐(0)
HDU1565 方格取数(1)(状态压缩dp)
摘要:题目链接。分析:说这题是状态压缩dp,其实不是,怎么说呢,题目数据太水了,所以就过了。手动输入n=20的情况,超时。正解是网络流,不太会。A这题时有个细节错了,是dp[i][j]还是dp[i][q[j]]? 答案是dp[i][j],因为q[j]必定会超(感谢CZ学长提示)。AC代码如下:#include #include #include #include #include #include using namespace std;const int maxn = 20000;int q[maxn], dp[21][maxn], G[21][21];int main() { int n;...
阅读全文
posted @
2013-08-06 22:28
Still_Raining
阅读(574)
推荐(0)
POJ2513 Colored Sticks(欧拉)
摘要:题目链接。题目大意:给很多木棍,两端被涂了颜色。任意两根木棍的相同颜色处可以拼接在一起,问有没有可能将所有的木棍都连起来,成一条直线?分析:考点,欧拉道路。将一根木棍看成一条边,两端的颜色看成两个点,问题成了,能否从无向图的一个结点出发走出一条道路,每条边恰好经过一次。求法:如果一个无向图是连通的,且最多有两个奇点(奇点指的是度数是奇数的点),则一定存在欧拉道路。是否连通可以通过并查集来求。#include #include #include #include #include #include using namespace std;const int maxn = 500000+10+10
阅读全文
posted @
2013-08-06 09:53
Still_Raining
阅读(247)
推荐(0)
POJ2242 The Circumference of the Circle(几何)
摘要:题目链接。题目大意:给定三个点,即一个任意三角形,求外接圆的周长。分析:外接圆的半径可以通过公式求得(2*r = a/sinA = b/sinB = c/sinC),然后直接求周长。注意:C++AC,G++WA。#include #include #include #include #include using namespace std;const double PI = 3.141592653589793;typedef struct Point { double x, y; Point (double x=0, double y=0):x(x),y(y) {};}Vector...
阅读全文
posted @
2013-08-05 16:41
Still_Raining
阅读(253)
推荐(0)