摘要: 题意:求到达任意俩点之间的最小消费,也可以说求任意俩点的最短路径啦分析:很直接的就是用floyd算法,很好写的一个算法,最坑爹的是距离要用__int64保存当然,对每一次询问都用单源最短路算法的SPFA 也行,不过慢了一点floyd#include<iostream>#include<algorithm>#include<math.h>#define MAXN 100+10using namespace std;int L[4],C[4],n;int X[MAXN];__int64 g[MAXN][MAXN];int get_dis(int i,int j) 阅读全文
posted @ 2012-02-23 22:38 枕边梦 阅读(319) 评论(0) 推荐(0) 编辑
摘要: 题意:在8 * 8 的跳棋棋盘上,给你两个状态,每个状态4个点,判断一个状态8步内能否到达另一个状态。分析:给定了始末状态,很典型的双向广搜。从始末两个方向进行广度搜索,理想情况下可以减少二分之一的搜索量,从而提高搜索速度。问题的关键在于状态的保存,因为四个棋子是一样的,棋盘的大小只有8*8,所以先按坐标排序之后,用二进制每三个位保存一个棋子的一个坐标,总共需要24个位。对双向广度搜索算法的改进:略微修改一下控制结构,每次while循环时只扩展正反两个方向中节点数目较少的一个,可以使两边的发展速度保持一定的平衡,从而减少总扩展节点的个数,加快搜索速度。这代码写的有点挫,用俩个BFS写的,不是用 阅读全文
posted @ 2012-02-23 19:54 枕边梦 阅读(767) 评论(0) 推荐(1) 编辑
摘要: hdu3350题意:按照宏定义的规则,计算一个给定的宏定义中‘+’的运算次数。分析:用栈实现的纯模拟的题目View Code #include<iostream>#include<algorithm>#include<stack>#define MAXN 1000+10using namespace std;struct number{ int x,num;};//保存出现过的数,以及该数字执行‘+’的次数stack<number> st;//保存出现过的数字stack<char> oper;//保存操作符char str[MAXN] 阅读全文
posted @ 2012-02-23 12:08 枕边梦 阅读(573) 评论(0) 推荐(0) 编辑
摘要: 题意:推箱子升级版,将三个箱子推到三个洞里,求最小步骤分析:思路不难,就是处理起来,细节太多,纠结死了。一个八维的布尔数组判重,差点就MLE了View Code #include <iostream>#include <algorithm>#include <queue>#define size 9using namespace std;struct Node{ int x, y; int Box[3][2];//记录三个箱子的位置 int step; char map[size][size];} start;int dir[4][2] = {{0, -1} 阅读全文
posted @ 2012-02-23 10:10 枕边梦 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 题意:要完成一批作业,假定每一科作业花的时间都为一天,若该科不能在相应的期限能完成,则扣除相应的分数,问完成这些作业最少扣多少分分析:贪心题贪心策略:先将作业按扣分值从大到小排序,若大小相等,则按期限从小到大排序。之后,用一个数组标记该天是否已用于完成作业。依次枚举每一科作业,从该科的期限往左移,若存在一天为用过的,则标记,否则,扣分View Code #include<iostream>#include<algorithm>#define MAXN 1000+10using namespace std;int n;bool vis[MAXN];struct work{ 阅读全文
posted @ 2012-02-23 00:50 枕边梦 阅读(200) 评论(0) 推荐(0) 编辑