上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 34 下一页
摘要: 题意:求到达任意俩点之间的最小消费,也可以说求任意俩点的最短路径啦分析:很直接的就是用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 枕边梦 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 题意:在8 * 8 的跳棋棋盘上,给你两个状态,每个状态4个点,判断一个状态8步内能否到达另一个状态。分析:给定了始末状态,很典型的双向广搜。从始末两个方向进行广度搜索,理想情况下可以减少二分之一的搜索量,从而提高搜索速度。问题的关键在于状态的保存,因为四个棋子是一样的,棋盘的大小只有8*8,所以先按坐标排序之后,用二进制每三个位保存一个棋子的一个坐标,总共需要24个位。对双向广度搜索算法的改进:略微修改一下控制结构,每次while循环时只扩展正反两个方向中节点数目较少的一个,可以使两边的发展速度保持一定的平衡,从而减少总扩展节点的个数,加快搜索速度。这代码写的有点挫,用俩个BFS写的,不是用 阅读全文
posted @ 2012-02-23 19:54 枕边梦 阅读(755) 评论(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 枕边梦 阅读(572) 评论(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 枕边梦 阅读(365) 评论(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 枕边梦 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 计算方程解的个数很巧妙的hash ,主要是要注意到a,b,c,d已经x的大小范围View Code #include <iostream>#include <algorithm>using namespace std;int hash1[3000005];int main(){ int a, b, c, d, x1, x2, x3, x4, ans; while (~scanf ("%d%d%d%d", &a, &b, &c, &d)) { if (a > 0 && b > 0 && 阅读全文
posted @ 2012-02-22 22:57 枕边梦 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 比较基础的并查集,求集合所含元素的个数,中间用字典树给出现过的名字标号View Code #include<iostream>#include<algorithm>#include<string>#define MAXN 100000+10using namespace std;int f[MAXN],r[MAXN],n,num;typedef struct node{ int cnt; struct node *next[52];}*tree,Trie;tree root; inline int GetNum(char *t)//用字典树对字符串编号{ t 阅读全文
posted @ 2012-02-22 20:32 枕边梦 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 简单的DFS,将所有未填的位置依次保存起来,之后,对每一个未填的位置依次枚举,往下搜即可;;本来想用DLX的做的,hdu3111是过了,可是原先那个模板在这道题里就是超时,不解啊,换一个模板就过了、DFS版#include<stdio.h>struct point{ int x, y;} p[81];int num, flag, map[10][10];int judge(int n, int k){ int i, j, x, y; for(i = 0; i < 9; i++) { if(i != p[n].y && map[p[n].x][i] == k.. 阅读全文
posted @ 2012-02-22 19:34 枕边梦 阅读(878) 评论(0) 推荐(0) 编辑
摘要: 精确覆盖: 首先选择当前要覆盖的列(含1最少的列),将该列和能够覆盖到该列的行全部去掉,再枚举添加的方法。枚举某一行r,假设它是解集中的一个,那么该行所能覆盖到的所有列都不必再搜,所以删除该行覆盖到的所有列,又由于去掉的列相当于有解,所以能够覆盖到这些列的行也不用再搜,删之。View Code /*DLX解决9*9的数独问题,转化为729*324的精确覆盖问题行:一共9 * 9 * 9 == 729行。一共9 * 9小格,每一格有9种可能性(1 - 9),每一种可能都对应着一行。列:一共(9 + 9 + 9) * 9 + 81 == 324 种前面三个9分别代表着9行9列和9小块,乘以9的意思 阅读全文
posted @ 2012-02-22 19:21 枕边梦 阅读(1239) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一个序列,之后又Q次询问,每次都是询问一个区间内最大值与最小值的差分析:RMQ,求区间最值RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值)。不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率。下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例)。 预处理: 预处理使用DP的思想.. 阅读全文
posted @ 2012-02-16 20:37 枕边梦 阅读(229) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 34 下一页