上一页 1 ··· 4 5 6 7 8 9 下一页
摘要: 题意:n个数,取它们的三个排列a[] ,b[] ,c[],要求(a[i]+b[i])%n == c[i]%n分析:n是偶数无解,n是奇数:a[i]=b[i]=i,c[i]=(a[i]+b[i])%n。。。不会证明。。。 阅读全文
posted @ 2013-05-18 17:05 心向往之 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 题意:求A^B的所有因数的和(0 >= 1; } return ans;}int cal(int p, int n){//计算1+p+p^2+...+p^n if(!n) return 1; if(n&1) return cal(p, n/2)*(1+modexp(p, n/2+1)) % mod; else return (cal(p, n-1) + modexp(p, n)) % mod;}void solve(int n){ s = 1; for(int i = 0; pri[i] * pri[i] 1) s = s * cal(n,b) % ... 阅读全文
posted @ 2013-05-18 15:44 心向往之 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 题意:定义两个三元组(xi, yi, zi)和(xj, yj, zj),他们的距离为dist = max( xi-xj, yi-yj, zi-zj) - min(xi-xj, yi-yj, zi-zj),给定n个三元组(n<=200000),求任意两个三元组的距离之和。令a=xi-xj,b=yi-yj,c=zi-zj,问题转化为dist = max(a, b, c) - min(a, b, c),考虑数轴上的三个点a b c, dist为它们覆盖的线段长度。dist = ( |a-b| + |b-c| + |c-a| ) / 2。这样一来就不用考虑a b c 谁大谁小。。所以dist = 阅读全文
posted @ 2013-05-17 17:59 心向往之 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 两题都是基础题,不同的是 zoj 那题的男女可能重名。Gale-Shapley 算法:while ( 存在男人m是自由的 ) { 令w是m的还没求过婚的最高排名的女人 if ( w是自由的 ) m-w 配对 else { 取 w 的当前对象 m1 if ( w 更爱 m1 ) m保持自由 else m-w配对 m1变成自由 }}poj 3487const int N = 105;int n;int hm[N], hw[N]; //hm[i]为第i个男人的配偶 -1表示自由int a[N][N], b[N][N], p[... 阅读全文
posted @ 2013-05-16 18:02 心向往之 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 题意:‘H’是山地,‘P’是平原,在平原上可以放置炮兵,攻击范围为图中黑色部分,炮兵不能放置在其他炮兵的攻击范围内,问最多能放多少个炮兵?分析:用一个整数s表示一行的状态,s的第k位为1表示这一行第k列放置了炮兵。cnt[s] 表示 s的1的个数,即放置了炮兵的个数。d[r][i][j]表示第 r 行状态为 i, r-1 行状态为 j 的最大炮兵数,d[r][i][j] = max( d[r-1][j][k] + cnt[i] ); 其中j k 与 i 不冲突。每行最多有10个格子,状态为2^10,但有一些状态是非法的,合法状态在60个以内,所以要先预处理出所有合法状态。const int N 阅读全文
posted @ 2013-05-16 12:33 心向往之 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 题意:两个球,两个目标点,每次同时向 上下左右 移动这两个球,若前面是墙,则不动,两球不能重合,若一球到达目标点,另一球可从那里经过。。问最少多少步能将两球移动到目标点。分析:广搜,用四维数组f[x][y][u][v]记录两球坐标分别为x y , u v 时的最少步数。注意两球要同时移动,且不能重合,但一球在目标点,另一球可以与它重合。int dx[] = {-1,0,1,0};//up Right down Leftint dy[] = {0,1,0,-1};const int M = 25;const int N = 100005;int n,m,ans;char c[M][M];//地图 阅读全文
posted @ 2013-05-12 13:48 心向往之 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 题意:有n道题目,a[i][j] 表示做完第 i 道题再做第 j 道题所要花费的时间。Zty每次只做比以前做过的题目更难的题目,也就是说时间比以前的长。问最多能做多少道题。(每次都从第0题开始做,第0题花费时间为0).分析:简单深度搜索。。const int M = 15;int n, ans;int a[M][M];int b[M];void dfs(int i,int t,int cnt){//解决完第i题 最长时间t 已解决cnt道题目 checkmax(ans, cnt); FOR(j, 1, n){ //if(ans==n)return; if(... 阅读全文
posted @ 2013-05-11 12:47 心向往之 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 题意:有n (n<=15) 本高度不同的书,每次可以交换相邻的两部分书(多本),问最少多少次操作可以让书由小到大排列?如果次数>=5 输出5 or more,否则输出最少次数。分析:n!的状态空间太大,不能广搜,于是想到迭代加深搜索,又因为每次操作,最多改变3个后继值,最终状态每本书的后继都比自身大1,可以设计启发函数为 错误的后继值/3.另外在回溯的时候,假设本次交换的区间为[1,5] [6,8]那么还原状态应该交换[1,3] [4,8],而不能再次交换[1,5] [6,8]。。 1 2 3 4 5|6 7 8交换[1,5] [6,8]: 6 7 8|1 2 3 4 5交... 阅读全文
posted @ 2013-05-11 11:54 心向往之 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 题意:n×m的棋盘上,0表示空格,可自由通过,-1表示宝石,正数k表示有一个值为k的石头,不能通过。两人轮流玩游戏,每次可以将一个从棋盘外围有路径可以到达的石头的值减1,若减为0则变为空格,可自由通过。问最后谁能拿到宝石。分析:一开始以为是博弈,后来想想,发现如果甲将宝石外围的某石头(和宝石有路径相连的石头)变成了空格,则乙就能拿到宝石。所以他们只会选择和宝石不相通的石头,或者宝石外围的值大于1的石头。于是先广搜一次,把宝石外围的石头标记一下。再从棋盘外围广搜,遇到石头,若是宝石外围的石头,则ans += val-1,val为石头的值。若是其它石头,ans += val。为了方便,我 阅读全文
posted @ 2013-05-10 19:02 心向往之 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 题意:m×n的迷宫, ‘S’ 起点 ‘D' 终点 '.' 可以走 ‘X’ 墙 ‘1’~‘9’炸弹的数量,往上下左右走一步花费1秒钟,炸一面墙多花1秒钟,问最少多长时间能走到终点。分析:迷宫最大为8×8,可以用一个long long表示状态,走过的地方为1,没走过的为0. 然后广搜...判重用的map[64],map[i][state]表示在第i个格子,状态为state所用的最少时间。如果只用一个map 同时存储第 i 个格子和状态state,会超时。另外state第50位置1不能用state |= 1<<50, 1默认int型,左移50位 阅读全文
posted @ 2013-05-10 15:58 心向往之 阅读(147) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 下一页