- 博客(58)
- 收藏
- 关注
原创 UVa:10051 Tower of Cubes(动态规划)
思路:LIS变形题,状态转移方程并不难想。i表示第i个立方体,j1表示正面,j2表示底面那么 dp[i][j2]=max{dp[i-1][j1]+1,dp[i][j2]} 每个立方体有两种状态用或者不用,通过颜色匹配来转移。之前一度让我纠结的就是该如何输出过程也就是构造最优解。因为它是通过颜色来转移的,而且要求输出哪个面,而且对于每个立方体不是每种颜色都可以改变。因此让我很是纠结。后来过了一段时间重新做这个题,每次使用这个立方体的时候都记录下使用的是哪个面。然后递归输出最优解,如果dp[i][j2]=
2013-10-31 19:07:29 683
原创 UVa:10801 Lift Hopping (Bellmanford求最短路)
其实还是个最短路的问题,但是建图略微麻烦。同一个电梯里相邻停留的楼层之间连边,有多个电梯停留的同一楼层之间连边。比较麻烦,我们可以从边的角度出发因此使用Bellmanford算法。这样求最短路就需要开一个二维数组,用1维表示电梯另1维表示楼层。核心是dist[T][to]>dist[F][from]+w。另外就是注意读取可以停留的楼层要用字符串读。dist[][]要将可以在0层停留的电梯初
2013-10-31 08:21:04 640
原创 UVa:10827 Maximum sum on a torus
一开始试图将原矩阵的上下左右八方向全部复制一遍来模拟这个环,后来发现难以解决最大矩阵长度只能是n的问题。于是后来想到了现在这个办法用取余来模拟循环,在水平的方向上有两种情况,分别是中间相连的和两边想加的,用前缀和的方法求和,但注意不要加重了。竖直方向上要枚举最优矩阵的边,然后往下累加,超过n的要取余,可以累加的边数目不超过n。这样一共是四重循环。数据量只有75。2.4s水过。。 #in
2013-10-29 13:26:59 580
原创 POJ:1077 Eight(双向BFS+判重)
HDU也有这道题但是数据比较强,我的代码过不了(内存超限了。。)。只能过POJ的。。 这是某大神的。。http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 我的代码。。用了stl这是速度慢的一个重要原因。。#include#include#include#include#includ
2013-10-28 22:06:15 684
原创 UVa:10048 Audiophobia
多元最短路变形题,最大边最小值。 #include #include #include #include using namespace std;int main(){ int C,S,Q,kase=0; while(scanf("%d%d%d",&C,&S,&Q)&&!(!C&&!S&&!Q)) { int gl[105][105];
2013-10-27 10:27:51 562
原创 ZOJ:3365 Integer Numbers
比赛的时候没能出来,其实离AC的思路也不太远了,但是没做出来就是没做出来。。思路:如果元素a[i],a[j]满足a[i] - i = a[j] - j,则a[i]和a[j]要么一同修改要么都不需修改。记录a[i]-i的最大出现次数cnt,cnt就是不需改变的数的最大个数,n-cnt就是需要改变的数的最少个数。 #include #include #include #incl
2013-10-26 22:54:10 587
原创 UVa:542 France '98
这周周赛做出来的唯一一道题,相比上周AC的那道C语言练习题有所进步,也不足为道。但它之于我最大的意义是没有看题解,是我完全独立做出来的。 一道纯概率题,一轮一轮的比,没什么太难的地方。。 #include #include #include #include #include #include using namespace std;struct Team{
2013-10-26 22:26:35 640
原创 NEFU:115 斐波那契的整除
这个算是开了数学正式的第一道题了。斐波那契数列博大精深。。质数数量斐波那契数列的整除性与素数生成性每3个连续的数中有且只有一个被2整除,每4个连续的数中有且只有一个被3整除,每5个连续的数中有且只有一个被5整除,每6个连续的数中有且只有一个被8整除,每7个连续的数中有且只有一个被13整除,每8个连续的数中有且只有一个被21整除,每9个连续的数中有且只有一个被
2013-10-26 16:46:31 919
原创 POJ:2263 Heavy Cargo
这个题是要求起点到终点的最小边的最大值。注意各种数组变量的初始化。首次尝试邻接矩阵做Bellmanford算法。。 #include#include#include#include#include#include#define MAXN 205using namespace std;int main(){ int n,m,kase=0; while(c
2013-10-25 19:52:12 621
原创 HDU:1176 免费馅饼
其实是经典的数塔问题。。 dp[i][j]=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]))+gl[i][j];最后答案是dp[0][5] #include#include#include#include#include#includeusing namespace std;int gl[100002][12]= {0};
2013-10-25 12:04:52 619
原创 ZOJ:2027 Travelling Fee
求起点到终点的某条路径长度减去其中一条边的最小值。依次删掉每条边,然后求起点到终点的最短路,最小的那个就是答案。还有就是map要记得清空,我在这里WA了一次。。 #include#include#include#include#include#includeusing namespace std;map mp;struct Edge{ int from,t
2013-10-25 07:16:12 639
原创 POJ:1125 Stockbroker Grapevine
Floyd入门题吧。不过POJ的数据比较水,没有不连通的情况。。 #include#include#include#include#includeusing namespace std;int gl[1005][1005];int main(){ int n; while(scanf("%d",&n)&&n) { memset(gl
2013-10-25 07:00:02 580
原创 POJ:2472 106 miles to Chicago
最短路变形题,相当于求最长路,Bellmanford算法轻松搞定。目测Dijkstra也可以解决,待会试一下。 #include#include#include#include#include#include#define MAXN 105using namespace std;struct Edge{ int from,to; do
2013-10-24 18:35:05 711
原创 POJ:2253 Frogger
跟UVa之前做的那道题是一样的,求起点到终点的最大边的最小值。Bellmanford思想变形即可。这里注意最外层循环是点个数减一,而非边数,这里搞错了超时了一次。。 #include#include#include#include#include#include#define MAXN 205using namespace std;struct Edge{
2013-10-24 18:22:00 570
原创 UVa:10085 The most distant state
八数码问题变形。还是bfs+判重,这里我尝试了set来判重,将9个格映射成一个9位整数。最后跑了3s多,还是很慢。。 #include#include#include#include#include#include#includeusing namespace std;int M[5][2]= {{1,0},{-1,0},{0,1},{0,-1}};struct St
2013-10-23 13:10:04 634
原创 UVa:10422 Knights in FEN (bfs+判重)
因为不懂knight的走法一直都跑不出样例来。。思路很简单,用bfs搜索就行。另外必须的是判重。我这里又用了map,其实map效率比不上hash的,但是我不会写hash。。。 #include#include#include#include#include#includeusing namespace std;struct State{ int step;
2013-10-23 07:05:55 635
原创 HDU:1427 速算24点
比赛的时候没能出,确实是我这方面太弱。一开始想到了全排列和回溯,但其实单纯的全排列一次只能解决一个问题而且受运算符影响,比如(a b)(c d)这种的全排列就算不了。问题还是出现在dfs上。我这里是学习了xlc的。不得不佩服一下,把计算分为两部分,如果这两部分计算便是从左往右的计算,如果与后面的计算就可以多个同时计算,确实是很巧妙,我还得慢慢研究一下。#include#include#
2013-10-22 07:27:59 876
原创 POJ:2240 Arbitrage(bellmanford判负环变形题)
跟bellmanford判负环是一样的,只不过这里是要求最大值,而且是乘积,如果最大乘积大于1则说明yes,否则为no。由于这里是求最长路,所以dist数组要初始化为最小即0。还有就是注意将源点初始化为1,我这里源点是0而不是1,这里WA了一次。。 #include#include#include#include#include#includeusing namesp
2013-10-21 22:00:26 787
原创 UVa:10344 23 out of 5
简单回溯。要用到全排列。 #include#include#include#includeusing namespace std;int x[10];bool ok=false;void dfs(int pos,int res){ if(pos==6) { if(res==23) ok=true
2013-10-21 12:18:56 616
原创 UVa:567 Risk (Floyd算法求所有顶点之间的最短距离模版题)
注意输出有格式要求。个人感觉用BFS也可以做出来,有空试试。。 #include#include#include#include#include#includeusing namespace std;int main(){ int n,kase=0; while(scanf("%d",&n)!=EOF) {
2013-10-21 11:31:33 694
原创 POJ:3259 Wormholes(SPFA判断负环)
这个题最坑爹的地方在于有重边,因此有邻接矩阵比较方便。所以无向图的时候要这样if(w而无向图 gl[u][v]=-w;#include#include#include#include#include#includeusing namespace std;int main(){ int T; scanf("%d",&T); while(T
2013-10-21 10:19:57 689
原创 UVa:10943 How do you add?
看着队友的blog说很容易,但是我还是想了一段时间才推出来的。。dp[i][j]=dp[i][j-1]+dp[i-1][j]。#include#include#include#define Mod 1000000using namespace std;int main(){ int dp[105][105]= {0}; for(int i=1; i<=100;
2013-10-19 10:33:15 611
原创 UVa:10913 Walking on a Grid
上个月刷动规被这个题给卡到,主要是纠结在还可以往左走这个地方上。今天回切动规,终于想到了办法。晚上再写具体思路,先贴上代码。 #include #include #include #define INF -2139062144using namespace std;int main(){ int n,K,kase=0; while(sca
2013-10-17 13:12:47 584
原创 UVa:141 The Spot Game
判断每次操作后的状态是否曾经出现或者旋转后是否曾经出现。数据很小,保存每次操作后的状态判断一下就行了。我一开始没审好题以为全都是4*4的格子,居然WA了而不是RE。。囧。。#include#include#includeusing namespace std;struct State{ bool flag[55][55]; State() {
2013-10-16 13:58:46 654
原创 UVa:10099 The Tourist Guide
#include #include #include using namespace std;struct Edge{ int to,from,cost;};int main(){ int N,R,kase=0; while(scanf("%d%d",&N,&R)&&!(!N&&!R)) { int n=0,u,v,w;
2013-10-15 21:04:23 630
原创 UVa:558 Wormholes
Bellman-ford判断是否存在负权值回路。 #include#include#include#include#includeusing namespace std;struct Edge{ int to,from,cost;};int main(){ int T; scanf("%d",&T); while(T--) {
2013-10-14 23:04:17 587
原创 POJ:1122 FDNY to the Rescue!
迪杰斯特拉算法求最短路。注意从i到j和从j到i用时是不同的,也就是是有向图。还有,最后要求的是从消防站到火警位置的最短用时,我因为这里没好好看题调了好久才发现。最后递归打印路径即可。#include#include#include#includeusing namespace std;struct Elem{ int _time,_org,_dest;};bool
2013-10-14 16:51:37 676
原创 USACO Section 1.4 Arithmetic Progressions (ariprog)
暴力。。加了一个无脑剪枝,水过去了。。/*ID:kkkwjx1LANG:C++TASK:ariprog*/#include #include #include #include #include using namespace std;int main(){ freopen("ariprog.in","r",stdin);
2013-10-13 07:49:27 724
原创 POJ:1035 Spell checker
当时刚参加ACM的时候卡住的一道题,现在做来是很轻松了。但是还是要注意一些习惯的问题。另外这道题用stl可能会比较慢,c++过了,g++超时了。。 #include#include#include#include#include#include#define MAXN 10005using namespace std;map mp;string dic[MAXN]
2013-10-13 07:09:47 637
原创 ZOJ:2750 Idiomatic Phrases Game
Dijkstra算法求最短路。之前一直TLE于是用了优先队列用了char[],其实是shortpath[i]=shortpath[v]+gl[v][i];这里在gl[v][i]为无穷大即v和i无边的时候溢出了。所以要特判一下gl[v][i]不是无穷大。#include#include#include#include#include#define MAXN 1050usi
2013-10-12 17:57:25 686
原创 POJ:1679 The Unique MST(判断最小生成树是否唯一)
MST一道经典变形题目。问你MST是否唯一。MST的权是唯一的,但MST不一定唯一。MST不唯一的必要条件之一是无向网有相同权值的边。即,MST不唯一,无向网一定有相同权值的边,但是无向网有相同权值的边,MST不一定唯一。得到一个逆否命题,MST没有使用无向网中相同权值的边,那么MST一定唯一。如果MST使用了无向图中相同权值的边,那么依次去掉这些边,如果某次去掉之后得到MST
2013-10-12 17:50:15 2353 1
原创 UVa:10986 Sending email
Dijkstra算法模版题。用优先队列优化,时间复杂度为elgv,用v^2的算法会超时。#include#include#include#include#include#define MAXN 20005using namespace std;typedef pair Pair;struct Edge{ int to,cost; Edge(int a=0,
2013-10-12 17:36:04 812
原创 HDU:4101 Ali and Baba(搜索+博弈)
上个月比赛时候的题,今天终于给AC了。主要看一个临界状态:-1被一圈1包围。这时候只要有人再拿了1个1,将打开包围-1的这个圈,那么下一个人肯定就是赢家。所以只要数出这个圈外的石头个数即可。当然如果本来就不存在这个圈,即-1原本就靠近边界,那么就是A赢。数圈外石头用BFS。为了方便,把这个圈成为墙。首先第一个BFS从-1出发,标记包围-1的所有0.这样会得到这样一个状况:墙包围了所
2013-10-10 18:25:41 896
原创 POJ:3026 Borg Maze
BFS+Prim.其实A跟S都一样。。用BFS求每个A(S)之间的最短距离,然后用Prim求答案就行了。想到是MST就好做了。。之前因为数组开小了,结果一直是TLE,查了一顿只发现了一些神奇的现象,囧。。另外如果一直狂WA的话,可以参考一下POJ的discuss。。 #include #include #include #include #include #i
2013-10-09 16:06:46 639
原创 UVa:10369 Arctic Network
事实上就是求最小生成树中第m-(s-1)条最长的边。在有前哨已经拥有卫星频道的情况下,如果某一个前哨使用卫星频道那么意味着删掉与该点关联的最长的一条边。用s个频道可以删掉(s-1)条最长边,所以答案就是第m-(s-1)条最长的边。#include #include #include #include #include #define MAXN 505using namespac
2013-10-09 13:45:58 610
原创 POJ:1751 Highways
最小生成树。这个题POJ上要用G++交,C++会超时。再就是注意到是special judge就行了,#include #include #include #include #include #define MAXN 1000using namespace std;struct Edge{ int a,b; double weight;};struct P
2013-10-09 12:45:02 727
原创 POJ:1789 Truck History
想到了最小生成树就很简单了。注意输出后面有个“."。 #include #include #include #include #define MAXN 2005using namespace std;int Match(char a[],char b[]){ int n=0,l=strlen(a); for(int i=0; i<l; ++i)
2013-10-09 07:38:50 600
原创 HDU:3650 Hot Expo
题意:sunnuy要游览世博会,每天都有N个节目,然后给你N个节目的起止时间,他不想错过所有节目,问你看完全部节目最少要多少天。思路:只需要知道最大重叠区间的重叠数是多少即可。可能是我做区间的贪心问题做多了,这道题用拿老一套居然不行。好在数据量比较小,但凡有节目的时间段就+1,最后统计最大值是多少即可。 #include #include #include #include
2013-10-08 21:42:35 676
原创 ZOJ:1586 QS Network
题意:求一个最小生成树。思路:prim最小生成树。 #include #include#include#include#include#define MAXN 1005using namespace std;int g[MAXN][MAXN];int main(){ int T; scanf("%d",&T); while(T--) {
2013-10-07 22:12:38 622
原创 UVa:571 Jugs
题意:给你两个给定容积的桶,无限量的水,要求你输出倒出指定容积水的步骤。思路:bfs+剪枝。一定要判重,否则会RE。递归打印步骤。 #include #include #include #include #include using namespace std;struct State{ int x[3],id;};struct Path{ int
2013-10-07 19:48:44 665
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人