随笔分类 -  acm

hdu 3682 To Be an Dream Architect
摘要:思路参考:http://blog.csdn.net/liuwei_nefu/article/details/6009644 改用vector实现。收获:另一种的hash思想,vector去重。最朴素的hash,即三维数组记录是肯定不行的。原文的作者思维很巧妙,看懂后非常容易实现。/**/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <climits>#include <algorithm>#include &l 阅读全文
posted @ 2011-09-15 21:08 FreeAquar 阅读(535) 评论(0) 推荐(0)
zoj Weekend Party
摘要:主要代码及思想来自http://zhyu.me/acm/zoj-3526.html略有改动这题卡了很久,然后想到网络流,键一个超级源点,连所有人,流量为2,然后每个人连能与其邻座的人,流量为1在把每个人连超级汇点,流量为2,如果最大流等于人数两倍,就表示有解。源点连每个人2流量,表示一个人两边都要坐人。人数为1或2的时候特判一下,可惜,超时。不过,像下文一样缩点,应该可以吧。。。/* 题意:n个人参加party,每个人的兴趣都是ACG (Anime, Comic and Game) 中的一种或几种,现在要让所有人坐成一圈,并且要让相邻的人至少有一种 共同兴趣,现在给出每个人的... 阅读全文
posted @ 2011-08-29 17:41 FreeAquar 阅读(340) 评论(3) 推荐(0)
pku 1020
摘要:题意:就是用几个小正方形,去拼成个大的正方形。思路:从大到小,从左到右,深搜,不是很难,网上的代码很简洁,我就不用自己的了,加点注释吧#include <stdio.h>#include <memory.h>int cnt[20]; //记录长度为i的正方形个数int len[50]; //记录目前第i列覆盖长度int cake_side, npiece;bool chk(int used){ if(used == npiece) //所有正方形都用上了,返回真,跳出 return true; int min = 100, ind = -1; for(int i... 阅读全文
posted @ 2011-08-26 23:42 FreeAquar 阅读(239) 评论(0) 推荐(0)
pku 2771 Guardian of Decency
摘要:题意:就是一个保守的老师,怕同学们谈恋爱,于是他觉得这样分组是没有问题的1.身高差距在40厘米以上2.同性别3.同样的音乐爱好4.不同体育爱好一下注释掉一段话,牢骚,之后正题/*话说这题真是命途多舛啊,中午没睡,困死,一看到找朋友,下意识并查集划分集合,写完后怎么也过不了样例好吧,再读一遍题,瞬间知道是二分匹配- -|||最后条件又忘写等号了贡献一次WA*/思路:题意是求最大独立集,即最大一个集合,其中任意两点之间都不存在边。求法是:最大独立集=顶点数-最大匹配数。因为我是直接用n个人对n个人匹配的(看了下网上好多用男匹配女的),所以求出的最大匹配数要除2.这样貌似会比男配女慢一些/**/#i 阅读全文
posted @ 2011-08-20 18:10 FreeAquar 阅读(210) 评论(0) 推荐(0)
poj 2455 Secret Milking Machine
摘要:题意:有N个点,之间有P条路(双向),要求每次从1到N走不同的路T次,求这T次中两点间路最长的一条思路:二分+最大流,如果两点之间有路,就建立流量为1的网络,然后二分路径长度,从新建立符合要求的图,求最大流注意重边的情况,如果是邻接表没事,否则注意,边不是取最小,要都存下,因为有可能都符合要求,WA了很多次都是错在这了三个小时就这么没了……今天一早,看出了原因了,于是用vector解决了,明显很慢啊,不知道是不是模板的原因……核心code:vector<int> map[nMax][nMax]; //原始图void rebuild(int mid){ memset(G, 0, si 阅读全文
posted @ 2011-08-18 11:04 FreeAquar 阅读(250) 评论(0) 推荐(0)
poj 3259 Wormholes
摘要:题意:就是有N个,M条道路,W条时间隧道,问是否能从某一点出经过一些道路和时间隧道后再次到达该顶点并且回到该点过去思路:最短路,只要有负权回路即可判断能回到过去注意,道路是双向的所以有2500*2条,再加上单向的W200条,贡献一次RE/* spfa() 2011-8-16*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <climits>#include <algorithm>#include <fun 阅读全文
posted @ 2011-08-16 11:20 FreeAquar 阅读(200) 评论(0) 推荐(0)
poj 3277 Bad Cowtractors
摘要:学习最小割的时候,要用到prim的最大生成树思想,于是找了到最大生成树的题目,做的试试分别用了kruskal和prim试了下kruskal很好想,排序的时候反过来就可以了,即,边的权值从最大向最小排列即可,最后判断下是否连通了而关于kruskal,我想了一下,按照原先的贪心思想,用两个集合A,B表示,A是已经连入的点,B是未连入的点这样,可以假设A与B分别是全连通(因为最总会变成一个最小生成树),这样,就只用每次找链接A与B间的最大权值,因为此时A,B已经是全连通了,就差一条边,只用取最大。每次对A缩点,对每条边进行这样的贪心就可以得到最大生成树了PS:注意prim的重边处理(我记得处理重边, 阅读全文
posted @ 2011-08-15 10:52 FreeAquar 阅读(344) 评论(0) 推荐(0)
poj 2594 Treasure Exploration
摘要:题意:类似于1422,也是最小路径覆盖,但是一定要仔细看题思路:顶点数-最大匹配要用floyd,因为A->B,和B->C,可以得到A->C,但是一旦匹配了A->B,A就与C不连通了囧,看discuss才明白的……/* 因为每个点可以属于多条路,如果只属于 其中一条路的话,匹配后,另外连接这点 的路可能就断了 2011-7-22*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <climits>#in 阅读全文
posted @ 2011-07-22 23:59 FreeAquar 阅读(244) 评论(0) 推荐(0)
pku 2092 Grandpa is Famous
摘要:很明显,是个水题,可惜我更水,错了好多次,刚好今天练习了第二短路的条数,所以,求第二高频率还是很得意很快的写出来了,然后就不停的WA……中间我想省略掉一次哈希的遍历,于是每次hash[an]++后就直接和Max,sec比较记录,但是这样的话,sec永远与Max只是差1,因为最高的频率是一个一个加上来的所以每次替换,Max只是加1,所以是错的……/* 题意:找出所有数中出现频率第二高的,如果有很多第二高的,那么按升序输出 思路:快排+哈希 2011-7-16*/#include <iostream>#include <cstdio>#include <cstring 阅读全文
posted @ 2011-07-16 22:09 FreeAquar 阅读(310) 评论(0) 推荐(0)
poj 2453
摘要:考察的是位运算,要求输入的N,找一个最小的大于N的数,并且其转换成2进制后1的个数不变思路:记录从右往左最第一组连续1的长度,然后将右边连续的0取反加1再将原先记录的1的长度减少1,加回原来的数/* eg. n=10011100 m=100111 m=100 t=3; m=11 n=10011111+1=10100000 n=n+m=10100011*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#inclu... 阅读全文
posted @ 2011-07-14 16:33 FreeAquar 阅读(303) 评论(0) 推荐(0)
poj 2186 && hdu 3836
摘要:大体思路都是找强连通子图,缩点,只是两个题目的所求不是太一样。hdu 3836:参考了qianshou的代码,网上的很多看的不是很懂,他写的很清晰,很好看懂http://blog.csdn.net/wsniyufang/article/details/6604503然后就是还要了解一点Tarjan算法,下面的那个网址讲的很清楚http://www.byvoid.com/blog/scc-tarjan/剩下的就是要自己写一个getans()的求结果的程序。经过缩点后,剩下的就是一个DAG图了。至于为什么是取入度和出度为0的点中最大的,我想了很久,还是不是特别清楚。我是这么想的,剩下的图如果要全联 阅读全文
posted @ 2011-07-14 15:17 FreeAquar 阅读(454) 评论(0) 推荐(0)
poj 3984 迷宫问题
摘要:题意:中文的,不解释了思路:唯一的难点是如何处理最短路径的输出,我的解决办法是将最短的路径储存在链表里,然后放到堆栈了保护起来+倒序一下#include <iostream>#include <cstdio>#include <cstring>#include <stack>using namespace std;struct Path{ int x, y; Path *forward; Path() {x=0; y=0; forward=NULL;}}path;stack<Path> st;int mov[][2]={{1, 0}, 阅读全文
posted @ 2011-07-05 10:25 FreeAquar 阅读(519) 评论(0) 推荐(0)
pku 2240 Arbitrage
摘要:#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <queue>#include <map>#define eps 1e-6using namespace std;int m, n, count[32];double Map[32][32];map<string, int> money;string type;bool spfa(){ queue<int> q; double dist[32 阅读全文
posted @ 2011-06-27 15:39 FreeAquar 阅读(227) 评论(0) 推荐(0)
pku 1860 Currency Exchange
摘要:题意:第一行:货币的总的种类,货币中心的数量,所持有的货币种类,持有该种类货币的数量后M行:货币a,货币b,汇率Rab, 手续费Cab, 汇率Rba, 手续费Cba思路:用spfa找到,看是否有负权回路(用count[]计数,记录每个结点进队次数,超过|n|次表示有负权),如果有,则表示可以一直增加自己的钱,用bellman也可以实现虽然是A了,感觉数据挺弱……比较郁闷的是小号交47ms,大号交79ms - -|||调了很久,最后很没脾气的加了eps,然后没有编译直接小号交了,居然A了……code:#include <iostream>#include <cstdio> 阅读全文
posted @ 2011-06-27 11:40 FreeAquar 阅读(309) 评论(0) 推荐(0)
pku 1502 MPI Maelstrom
摘要:题意:有N个处理器,要传递信息,从1号开始,传播一次后可以从这两台处理器同时进行传播,以此类推思路:样例画了个图,发现从1开始走到每个点的时候都是1到此点的最短路径,于是想到了spfa算1到每个点的距离,然后取最大值即可code:#include <iostream>#include <cstdio>#include <queue>#include <cstring>#include <string>#include <cstdlib>#define MAXN 105#define INF 0x7fffffffusing 阅读全文
posted @ 2011-06-26 11:38 FreeAquar 阅读(436) 评论(0) 推荐(0)
pku 3009 Curling 2.0
摘要:非常好的一道搜索题,花了一个下午和一个晚上去做去理解题意:虽然英语很长,不过不是太难懂,就是可以向四个方向扔小球,每次扔出去,会一直走,直到遇到墙时停止,或出界失败,而遇到墙后,球会停止,然后所撞到的墙消失,给一个起点和一个终点,能在10步之内到达的则输出其最少步数思路:虽然是搜dfs题目搜到的这道题,但是开始看题意是说要求最少的步数,第一个想到的自然是BFS,感觉稍微变形下,类似回溯,只是每次都是四个方向同时判断,然后入队,再继续广搜。然而,花了整整2个多小时,依然调不好,思路也越来越乱了,上百度搜了下,全是dfs的解法。仔细看了下,发现和自己写的bfs几乎一致,于是,决定从新再写一遍,改一 阅读全文
posted @ 2011-04-26 23:47 FreeAquar 阅读(262) 评论(0) 推荐(0)
pku 2159 Ancient Cipher
摘要:怎么说呢,题目挺水的,题意理解错了,以为是凯撒排序, 然后两个快排,wa掉了- -|||太恶心了,题目给的样例居然是用凯撒密码能过的!!!然后看了Discuss,发现原来题目是要求判断两个字符串中,第一个串中出现的字母数及其频率,对应与第二个字符串出现的频率相同即可例如:AABBCEF BCCGGHJ,A出现的次数是2,B出现的次数是2, C,E,F都是1;第二串中 C,G出现2次,B,H,J出现一次,即频率是是相同的,输出YES思路:用哈希表发就可以了,记录每个字母出现个数,然后两次快排, 比较就行了0MS 144Kcode:#include <iostream>#include 阅读全文
posted @ 2011-04-04 14:16 FreeAquar 阅读(318) 评论(0) 推荐(0)
hdu 2817 A sequence of numbers
摘要:就是通过前三个数来判断是等差还是等比数列,注意别越界,用__int64code:#include <stdio.h>#include <iostream>#define m 200907using namespace std;__int64 pow_mod(__int64 a, __int64 n){ if(n==1) return a; __int64 x = pow_mod(a, n/2); __int64 ans = x*x%m; if(n%2 == 1) ans=ans*a%m; return (int)ans;}int main(){ int n; __int 阅读全文
posted @ 2011-03-15 18:29 FreeAquar 阅读(347) 评论(0) 推荐(0)
pku 2498 StuPId
摘要:主要是看题,要把id number 反过来乘以9,3,7的循环然后……poj不支持strrev()函数……不信的可以自己试试……#include <iostream>#include <cstdio>#include <cstring>#include <string>using namespace std;int cas[10]={9,3,7,9,3,7,9};void strreved( char *source ){ int l = strlen( source ); char temp; int i; for( i = 0; i < 阅读全文
posted @ 2011-02-12 22:58 FreeAquar 阅读(232) 评论(0) 推荐(0)
pku 1836 Alignment
摘要:因为是权初始化mark1[],mark2[]为0,所以最后要再减去2,mark1[i]为从第1个到第i个人中最长递增子序列的最长长度,mark2[i]为从第个i到最后一个人中最长递减子序列的最长长度,求峰值code://204k, 32ms#include <iostream>#include <cstdio>#include <cstring>using namespace std;double list[1005];int n, mark1[1005], mark2[1005];int main(){ while(scanf("%d" 阅读全文
posted @ 2011-01-25 01:17 FreeAquar 阅读(173) 评论(0) 推荐(0)