摘要: 题意: 有 n 个砖块,知道了每个砖块的位置和人的起始位置 st,现在要把这 n 块砖搬到st,每次最多能搬回两块砖,搬砖块的体力耗费为两个地点距离的平方, 问搬回这 n 块砖所需消耗的最小体力是多少,并按字典序输出搬砖块的顺序。分析: dp[i] 表示 i 状态的最小值 dp[i] = max(dp[i],dp[i |(1<<j)]+2*dis[n][j]) 搬一块砖的时候 dp[i] = max(dp[i],dp[i|(1<<j)|(1<<k)]+dis[n][j]+dis[j][k]+dis[n][k]) 搬两块砖的时候 同时用pre[] 记录状态转移 阅读全文
posted @ 2012-10-06 21:05 'wind 阅读(464) 评论(0) 推荐(0) 编辑
摘要: 题意: 用正方形拍子拍蚊子,拍T次,每次至少要拍死一个蚊子,一次拍死N只得N*N点经验,每次每只蚊子的位置不一样,死了的蚊子不记入以后,问最多能得 多少经验。分析: dp[i][j] 表示第 i 次在 j 状态下的最大经验值,需要求出第 i 次能一次拍死的所有的蚊子组合,对于每只蚊子需要考虑两种情况: ① 刚好被覆盖的情况 ② 刚好不被覆盖的情况 可以在原来的坐标加上一个很小的偏移量#include<stdio.h>#include<string.h>#include<algorithm>#include<vector>using namespa 阅读全文
posted @ 2012-10-06 16:14 'wind 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个地点可以建通讯站,知道了每个地点建立通讯站的费用,有m个需求,每个需求 u,v,c表示如果建立了 u 和 v 通讯站可以获得 c 利润,问建 里那些通讯站可以使得收益最大。分析:将边看成点,求最大权值闭包。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<climits>#define min(a,b)(a)<(b)?(a):(b)const int INF=INT_MAX;const int maxn=60000;const int maxm=20 阅读全文
posted @ 2012-10-06 12:52 'wind 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一系列的关系,有“>” "=" "<" 判断给出的关系中是不是有唯一的排序方式,如果没有判断是否有冲突或者是不确定的关系。分析: 这题比较特殊的地方是要处理好“=”关系,把所有的“=”关系用并查集放到一个集合里即可。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 10005int f[maxn];int find(int x){ return f[x]==x?x:(f[x]=find(f[x 阅读全文
posted @ 2012-10-06 11:27 'wind 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。分析: 二分枚举差值,如果满足完全匹配则该差值符合。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int g[105][105];int link[105];int v[105];int n;int res;int mid,p;int find(int x){ int i; for(i=1;i<=n;i++) { if((!v[i])&&(g[x 阅读全文
posted @ 2012-10-06 11:24 'wind 阅读(239) 评论(0) 推荐(0) 编辑