上一页 1 2 3 4 5 6 ··· 17 下一页
摘要: 题意:A password locker with N digits, each digit can be rotated to 0-9 circularly. You can rotate 1-3 consecutive digits up or down in one step. For examples: 567890 -> 567901 (by rotating the last 3 digits up) 000000 -> 000900 (by rotating the 4th digit down) Given the current state and the sec 阅读全文
posted @ 2012-10-28 19:12 'wind 阅读(489) 评论(0) 推荐(0) 编辑
摘要: 题意:有n个地点,知道了每个地点的坐标,现在要选择一些地点建加油站,并且总花费最少(其中1号位置必须建立加油站)。在 i 点建立加油站需要花费为2^i。 建立加油站要求能使得汽车从1点开始走遍全图所有的点并回到1点,途中汽车加油次数不限,每个加油站的使用次数不限,汽车每次加满油之后最多能行驶 的距离为D。分析:要尽量不在号比较大的点建加油站,如果在n号点建立加油站,则总费用会大于在除n 以外的所有点都建加油站的总费用。可以先尝试把除了n点以外的所有 点建立加油站,观察是否满足要求。若满足则说明我们必然不会在n点建立加油站,若不满足我们就一定要在n点建加油站。若需要建,我们就建,然后就不 用再考 阅读全文
posted @ 2012-10-27 21:03 'wind 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 题目:mmm is learning division, she's so proud of herself that she can figure out the sum of all the divisors of numbers no larger than 100 within one day! But her teacher said "What if I ask you to give not only the sum but the square-sums of all the divisors of numbers within hexadecimal num 阅读全文
posted @ 2012-10-26 21:14 'wind 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 题意:判断矩阵是否符合条件:思路:建图方式 对于&操作, if(c=1) 当a为1时b必须为1,当b为1时a必须为1; 当a为0时a必须为1,当b为0时b必须为1,否则不可能为1 else{ 当a为1时b必须为0,当b为1时a必须为0; 当a为0时一定为0没有矛盾产生,当b为0时一定为0没有矛盾产生; } 对于|操作 if(c=0) 当a为0时b必须为0,当b为0时a必须为0; 当a为1时a必须为0,当b为1时b必须为0,否则不可能为0 else{ 当a为0时b必须为1,当b为0时a必须为1; 当a为1时一定为1没有矛盾产生,当b为1时一定为1... 阅读全文
posted @ 2012-10-25 07:46 'wind 阅读(441) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出 n 个序列,要求把它分成长度相等的m份,多余的去掉,要求每份的最大值之和大于 k。 问最少要分成多少份。分析: 二分区间,用rmq预处理出区间最大值。#include <stdio.h>#include <string.h>#include <math.h>#define max(a,b)(a)>(b)?(a):(b)#define maxn 200005int val[maxn];int dp[maxn<<1][20];int k,n;void makermq(){ int i, j; for(i = 1; i <= 阅读全文
posted @ 2012-10-25 07:41 'wind 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 题意: 从长度为 n 的数字中去掉k个数字,问剩下的数字组成的数最小是多少。分析:可以看成从原来的数字中找一个长度为n-k的子串并且最小。每次从第st 个位置到第k+top个位置中找到最小的一个数字 st 为上次找到的数子的后一位,top为当前已经找到的数字个数。#include <stdio.h>#include <string.h>int main(){ char s[1005]; int res[1005]; int i, j, k; while(scanf("%s%d",s,&k)!=EOF) { int n = strlen(s); 阅读全文
posted @ 2012-10-13 13:02 'wind 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 题意: 求出 n 以内的最大反素数。分析: 如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数. 求[1..N]中最大的反素数–>求约数最多的数 如果求约数的个数 756=2^2*3^3*7^1 (2+1)*(3+1)*(1+1)=24 基于上述结论,给出算法: 按照质因数大小递增顺序搜索每一个质因子,枚举每一个质因子 剪枝: 性质一: 一个反素数的质因子必然是从2开始连续的质数. 因为最多只需要10个素数构造:2,3,5,7,11,13,17,19,23,29 性质二:p=2^t1*3^t2*5^t3*7^t4…..必然t1> 阅读全文
posted @ 2012-10-13 09:29 'wind 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题意: 在连续的 n 秒中,每秒会出现 m 个龙珠,出现之后会立即消失,知道了第一秒所在的位置,每从一个位置移动到另一个位置的时候,消耗的价值为 abs(i-j), 知道了次出现的龙珠的价值,问 n 秒之后得到的最大价值是多少。分析: 当 pos[i][j] >= pos[i-1][k] 时:dp[i][j]= min( dp[i-1][k] - pos[i-1][k] ) + pos[i][j] + w[i][j]; 当 pos[i][j] <= pos[i-1][k] 时:dp[i][j]= min( dp[i-1][k] + pos[i-1][k] ) - pos[i][j] 阅读全文
posted @ 2012-10-12 20:05 'wind 阅读(440) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条。分析: 求最短路的条数可以用最大流,不过要是去掉原图中不在最短路上的边, 判断某条边是不是最短路上的边的时候,如果满足 d1[from] +d2[to]+ edge[i].w =dis[en] 则可以说明该边是最短路上的边,其中 d1[] 为各点到起点的最短距离,d2[] 为各点到终点的最短距离#include<stdio.h>#include<string.h>#include<stdlib.h>#include<climits>#include&l 阅读全文
posted @ 2012-10-12 19:10 'wind 阅读(972) 评论(0) 推荐(1) 编辑
摘要: 题意: 有 2*n个同学,n男n女,知道了 有 m 对 男女之间木有吵过架,现在这 n 个女生要找对象,要求没有和她吵过架或者没有和她的一个朋友吵过架, 当 n 个女生都找到对象的时候算作一轮,然后重新找,满足每个女生都不能找和上次一样的对象,而且每个女生除了自己没有吵过架的人外,最多 可一和 k 个男生成为朋友,问最多能进行多少轮。分析: 建图: 将每个女生 i 拆成两个点 i 和 i+n 如果女生 i 可以和 男生 j 没吵过架,就在 i 和 j 之间连一条容量为 1 的边 否则在 i+n 和 j 之间连一条容量为 1 的边 在 i 和 i+n之间连一条容量为 k的边, 在 s 和 1.. 阅读全文
posted @ 2012-10-11 23:34 'wind 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 2*n个同学,n男n女,知道了 有 m 对 男女之间木有吵过架,现在这 n 个女生要找对象,要求没有和她吵过架或者没有和她的一个朋友吵过架, 当 n 个女生都找到对象的时候算作一轮,然后重新找,满足每个女生都不能找和上次一样的对象,问最多能进行多少轮。分析: 将是朋友关系的女生放到一个集合,用来降低建图的时间复杂度。#include <stdio.h>#include <string.h>#define maxn 102#define clr(x)memset(x,0,sizeof(x))int f[maxn];int search(int x){ retu 阅读全文
posted @ 2012-10-11 20:37 'wind 阅读(331) 评论(1) 推荐(0) 编辑
摘要: 题意: 有一个烧烤机,每次最多能烤 m 块肉,现在有 n 个人来买烤肉,每个人到达时间为 si,离开时间为 ei,点的烤肉数量为 ci,点的烤肉所需烘烤时间为 di, 每个人要烤的肉可以分成若干份在同时烤,问是否存在一种方案可以满足所有顾客的需求。分析: 将所有的到达时间和结束时间按升序排序,得到 x <= 2n-1 个时间区间。 建图: s为源,t为汇, 每个顾客i作为一个结点并连边(s, i, ni*ti) 每个区间j作为一个结点并连边(j, t, (ej-sj)*M),其中sj, ej分别表示区间j的起始时间和终止时间 对任意顾客i和区间j,若 [sj, ej] 完全包含在 [si 阅读全文
posted @ 2012-10-11 00:53 'wind 阅读(602) 评论(0) 推荐(1) 编辑
摘要: 题意: 有n个人正在玩游戏,完成一个传递的游戏,假如A传递到B,B传递给C,则C拥有2的传递值,C是胜利者,如果C又传递回A,那么A,B,C三者都拥有传递值为2的 胜利者,输出最后获得的最多传递值和拥有该传递值的人。分析:强连通缩点后用树形DFS找到最大值。#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define clr(x) memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b)#defin 阅读全文
posted @ 2012-10-08 23:26 'wind 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个团队和 m 艘船,每艘船的载客量为 k,每个团队的人数为ai+1 ,转载该团队可获利润 bi,要求每个团队的所有人必须在同一艘船上, 且团队优先级高的团队所在船编号不能大于优先级低的团队,求可以获得的最大利润。分析:dp[i] 表示获得 i 利润时需要的最少船位,且要保证优先级高的团队优先考虑。#include <stdio.h>#include <string.h>#define INF 0x1f1f1f1f#define v 10005int min(int a,int b){ return a<b?a:b;}int dp[v+1];int 阅读全文
posted @ 2012-10-08 17:55 'wind 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 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) 编辑
摘要: 题意: 给出一个有n 个节点的和m 条单向边,问图中是否任意两点都是连通的,这里连通的定义为:u,v连通,则存在一条从u到v的边或存在一条从v到u的边。分析:因为在一个强连通分量内部的点是两两可达的,所以可以先对所有的强连通分量缩点,即把强连通分量内部的点看成是一个点。如果两点不可达那么在拓 扑排序时,该两点谁也不是谁的前驱和后继,所以在拓扑排序时只要同时出现至少两个入度为0的点,那么这些点一定互不可达,所以只要判断拓扑的方式 是否唯一即可。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeo 阅读全文
posted @ 2012-10-03 17:39 'wind 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了一颗有 n 个节点的树和树上每条边的权值,对应两种操作: 0 x 输出当前节点到 x节点的最短距离,并移动到 x 节点位置 1 x val 把第 x 条边的权值改为 val分析: 树上两个节点a,b的距离可以转化为 dis[a] + dis[b] - 2*dis[lca(a,b)] 其中 dis[i] 表示 i 节点到根的距离, 由于每次修改一条边,树中在这条边下方的 dis[] 值全都会受到影响,这样每条边都对应这一段这条边的管辖区, 可以深搜保存遍历该点的时间戳,ll[i] 表示第一次遍历到该点的时间戳, rr[i] 表示回溯到该点时的时间戳,这样每次 修改边 i 的时候就可 阅读全文
posted @ 2012-10-03 10:22 'wind 阅读(1666) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 n 个教室组成一个连通图,知道了m条无向边,现在要去掉一条边使得这些教室分成两个连通的集合,问是否可以做到,如果可以找出两个集合人数 的最小差值。分析: 因为所有的在同一个双连通分量中的人都必须在一个集合里,可以先求出所有的双连通分量并染色,然后用树形DP求出最小差值即可。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b)#define maxn 100005#define maxm 1000005st 阅读全文
posted @ 2012-10-02 13:27 'wind 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 题意:有 n 座城市和 m 条有向边,现在要把这 n 座城市分成一些洲,要求: 如果城市 u,v 之间可以互达则两座城市要分在一个洲里面, 每个洲里面的任意两个城市 u,v之间至少需要存在一条边,问做少能够分成多少个洲。分析:先求强连通分量并进行缩点,重新建图,如果两个强连通分量之间如果存在一条边连接其中一个强连通分量内部的一个点和另一个强 连通分量内部的一个点则连一条边从第一个强连通分量到第二个强连通分量,求出最小路径覆盖即为答案。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x) 阅读全文
posted @ 2012-10-01 21:07 'wind 阅读(453) 评论(0) 推荐(0) 编辑
摘要: 题意: 已知有 n个农场,知道了每个农场的坐标,有两个中转站 s1,s2,每个农场和其中一个中转站相连, 有 A 对hate关系 a,b 表示 a 和 b 农场不能和同一个中转站相连,有B对Fs 关系a,b 表示 a和 b农场必须和同一个中转站相连, 求一种连接方案,在满足条件 A,B的条件下,图中任意两个农场的最大距离最小。分析:i表示第 i 个农场和中转站 s1 相连,i + n 表示第 i 个农场和中转站 s2 相连, 建图: 在 A 条件中,对于每对关系i , j 连边i-> j + n i + n ->j j ->i + n j + n ->i表示 i 和 j 阅读全文
posted @ 2012-10-01 14:49 'wind 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 题意:已知有 2*n把钥匙,这些钥匙两两一组,每组只能用其中的一把钥匙,有 m 个门,每个门上有两把锁,只要有一把锁被打开门就可以被打开, 一个门上可能是两把相同的锁,不同的门上也有可能有相同的锁,给出门的顺序,问最多可以打开多少扇门。分析: 每种钥匙都有两种状态,用 or 不用, kn = 2*n i 表示 第 i 把钥匙被用,i + kn 表示 不用第 i 把钥匙, 在给出的要是分组中的 i , j 连边 i - > j + kn j->i+ kn 表示 如果用 i 钥匙则 j 钥匙不能用,如果用 j钥匙则 i 钥匙不能用 2 分枚举要开的前 k 个门,对于每个门上的两把锁 i 阅读全文
posted @ 2012-10-01 13:15 'wind 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 题意:有 n对新人结婚,只有一个牧师,知道了每个婚礼的开始时间 s,和结束时间 t 和需要牧师的主持时间 las,牧师可以选在在[s,s+las]或[t-las,t]两个时间段内主持,问是否存在一个时间安排,使得所有新人都可以得到牧师的主持。分析: 每一个婚礼主持时间都是两种状态,每个婚礼之间的时间可能会互相限制,可以用2-sat判断是否冲突。建图: 每个婚礼的两个时间段 i = [s,s+las],i +n= [t-las,t] 如果 i 和 j 冲突,建边 i -> j + n 如果 i 和 j + n 冲突,建边 i -> j 如果 i + n 和 j 冲突,建边 i + n 阅读全文
posted @ 2012-10-01 10:40 'wind 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了n 个连续位置处砖块的高度,有m个如下询问 l r h :区间[l,r] 中高度小于等于h的砖块有多少个。分析: 用树状数组离线处理砖块的高度,对砖块按高度从低到高排序,对询问按 h 从低到高排序,因为高度较小的砖块 不会影响跳 跃高度较大时候的答案,所以可以依次加入砖块,求出每个区间 的数目。#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define clr(x)memset(x,0,sizeof(x))#define maxn 10000 阅读全文
posted @ 2012-09-30 22:46 'wind 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 题意:已知一个圆上顺时针放着 n 个点,这 n 个点中有m对顶点之间有连线,连线要么在园外要么在圆内,每个点最多连接一条边,问是否存在一种连接情况满足所有的 边都不相交。分析:将每条边看成两个点 i ,i+m 分别表示边在内部和在外部,如果两条边i,j的端点存在序号上的交叉,则这两对点之间的连线一个在外部一个在内部 即如果存在 i,则必存在 j+m ,如果存在 j ,则必存在 i+m, 如果存在 i+m,则必存在 j ,如果存在 j+m ,则必存在 i, 建图的时候连的边为 i -> j+m j -> i+m i+m -> j j+m -> i求出强连通分量并染色,判断 阅读全文
posted @ 2012-09-29 14:06 'wind 阅读(176) 评论(0) 推荐(0) 编辑
摘要: =============================以下是最小生成树+并查集======================================【HDU】1213 How Many Tables 基础并查集★1272 小希的迷宫 基础并查集★1325&&poj1308 Is It A Tree? 基础并查集★1856 More is better 基础并查集★1102 Constructing Roads 基础最小生成树★1232 畅通工程 基础并查集★1233 还是畅通工程 基础最小生成树★1863 畅通工程 基础最小... 阅读全文
posted @ 2012-09-28 20:49 'wind 阅读(501) 评论(0) 推荐(1) 编辑
摘要: 题意: 给出一颗有 n 个节点的树,问u 和 v 的最近公共祖先。分析: rmq:对树先进行深搜,记录深搜序列和每个序列的深度,将最近公共祖先的询问转化为区间最值问题。 tarjan:保存所有询问,在深搜的时候同时保存答案。rmq_在线算法#include<stdio.h>#include<string.h>#include<math.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 10005struct node{ int to,next;}e[100000];int tot;int head[maxn] 阅读全文
posted @ 2012-09-26 19:38 'wind 阅读(249) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 ··· 17 下一页