04 2012 档案

摘要:/*题目: 星星有等级,每颗星星的等级划分为在它下方(坐标轴上)有多少颗星星即为多少等级分析: 由于先输入的是x坐标,而y坐标已经是按照由小到大输入的,所以可以用树状数组来求和的形式 来求出该行星的等级。*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define X 40005int c[X],ans[X],n;int lowbit(int x){ return x & -x;}void modify(int x){ while(x<X) 阅读全文
posted @ 2012-04-30 22:18 yejinru 阅读(229) 评论(0) 推荐(0) 编辑
摘要:/*字符串DP,但是要找到用最小的字符串来匹配,所以用dp储存当前所使用过的字符串数。打印路径的话直接用数组表示前缀*/#include <iostream>#include <string>#include <cstring>#include <cstdio>using namespace std;string s = "22233344115566070778889990";#define X 50010int dp[X],pre[X],len[X],p[X],L;string a[X],in[X],b;void chan 阅读全文
posted @ 2012-04-30 16:01 yejinru 阅读(208) 评论(0) 推荐(0) 编辑
摘要:/*题目: 把石头分成两堆,问最小的重量差值为多少。分析: 先求和,然后用和的一半转为01背包。转移方程为: dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+w[i]); 缩小维度后为dp[j] = max(dp[j],dp[j-w[i]]+w[i]);*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int X = 2000010;int dp[X],w[25],n;int main(){ freopen(& 阅读全文
posted @ 2012-04-30 15:53 yejinru 阅读(228) 评论(0) 推荐(0) 编辑
摘要:/*题目: 寻找图中的最小环,输出路径。分析: 可以通过枚举删除其中的一条边,看看能否从该边的一点走到另一点,若能并且该最短路的长度加上 删除的边的长度小于当前的最优解的话,更新路径与最优解。而打印路径可以通过数组来表示该点的 前一顶点,然后递归打印路径即可。最短路可以通过dijkstra算法求出。估计的时间复杂度为O(n^2*E)。 我交了一下,用时:1.328 内存:264 KB*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int X = 阅读全文
posted @ 2012-04-30 10:03 yejinru 阅读(316) 评论(0) 推荐(0) 编辑
摘要:/*题目: 冰球游戏,每次都得需要往左右前后移动相应的步数,只有遇到石块才会停止在石块前,不然的话 就要出界。问如何从出发点移动冰球使它到达终点,若不能输出-1,可以的话输出最小的移动次数。 另外超出十次还没移动到终点的话,也算输分析: 由于长和宽都最大只有20,另外也同样只有十次而已,所以可以用深搜来做。每次先判断需要移动的 到哪个位置,然后判断到达终点时的总移动次数是否大于10,没有则更新答案。另外需要注意的是, 每次移动时都需要先对该位置碰到的石块置空,然后递归搜索该位置是否能到达终点,递归完了之后 需要对地图位置置为1,代表原来的位置为石块。*/#include <iostrea 阅读全文
posted @ 2012-04-26 17:28 yejinru 阅读(185) 评论(0) 推荐(0) 编辑
摘要:/*题目: 给出一个点的坐标以及以它为半径的半圆,现给出所有的零散的点的坐标,问最多半圆能覆盖的点的数目分析: 先预处理完所有的点到圆心的距离,然后排序得到所有可以在整个圆上的点,再枚举其中一个点作为 半圆的一条半径,再用叉积分>=0和<=0分成两类,判断这两个与答案的最大值,更新后输出答案*/#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>using namespace std;#define MAXN 160#define esp 1e 阅读全文
posted @ 2012-04-22 20:23 yejinru 阅读(194) 评论(0) 推荐(0) 编辑
摘要:/*题目: 求两线段是否重合、平行或相交分析: 利用叉积运算很容易算出来,我们可以先判断是否是平行的,只需将每一段线段向量化,再与另一个 向量做叉积运算,若为0即平行或重合,判断是否重合,只需找其中一个向量与该向量的一端与另一向量 的一端组成的向量做叉积运算,为0即为重合。 不平行的话,那么在本题中有一个交点,可以求到两线段分别所在的直线(ax+by+c=0),然后联立方程解出 x,y即可(这是我自己做的方法,可能有些漏洞,网上有很多模板)*/#include <iostream>#include <cstdio>#include <cmath>using 阅读全文
posted @ 2012-04-13 07:23 yejinru 阅读(369) 评论(0) 推荐(0) 编辑
只有注册用户登录后才能阅读该文。
posted @ 2012-04-10 11:34 yejinru 阅读(9) 评论(0) 推荐(1) 编辑
摘要:/*题目: 就是所在矩形中有一些外星人,一些人组队打怪去,可以分很多支队,问这些队一共所需的 最少移动步数分析: 由于可以分很多队,所以可以看做是从起点出发求最小生成树(其实有无起点一样,MST肯定 包括起点),于是问题转换为求最小生成树。怎样处理点与点之间的距离。其实每两个点之间 肯定存在通路,而任两点之间的最小直接距离可以通过bfs求到,于是可以通过枚举所有的点 (即外星人和起点)到另外的点(还是外星人和起点)的距离。具体实现看代码*/#include <iostream>#include <cstring>#include <cstdio>#inclu 阅读全文
posted @ 2012-04-09 22:37 yejinru 阅读(164) 评论(0) 推荐(1) 编辑
摘要:/*贪心: 当为6*6时,只能用一个盒子装 当为5*5时,可以每一个多装11个1*1的盒子 当为4*4时,可以先装2*2的盒子,每一个4*4的可以装5个2*2,若2*2不够,则装1*1的 当为3*3时,每一个可以装4个3*3,若最后不足4个,先用2*2的装,空余的位置用1*1装 当为2*2时,每一个可以装9个2*2的,最后有剩余装1*1的 若最后还有1*1的,每36个可以装一盒,多的算多一盒*/#include <iostream>#include <cstdio>using namespace std;#define X 7int a[X];int main(){ f 阅读全文
posted @ 2012-04-07 21:09 yejinru 阅读(158) 评论(0) 推荐(0) 编辑
摘要:/*题目: 象棋中的车在象棋盘上可以放置的最大数目(若没有挡板的话,在同一行或同一列的车 可以相互攻击,问的是所有的车可以和平地放置的最大数目)分析: 方法一: 可以通过暴搜得到答案(题目数据较小) 方法二: 可以通过构造二分图的方法来做,以下主要分析二分图的解法方法: 我们将每一行,每一列被墙隔开,且包含空地的连续区域称作“块”。显然,在一个块之中, 最多只能放一个车。我们把这些块编上号。 同样,把竖直方向的块也编上号。 把每个横向块看作X部的点,竖向块看作Y部的点,若两个块有公共的空地,则在它们之间连边。 于是,问题转化成这样的一个二部图: .X.. .... XX.. .... 我们可以 阅读全文
posted @ 2012-04-07 19:33 yejinru 阅读(243) 评论(0) 推荐(2) 编辑
摘要:/*题目: 当狼与猪相邻时,狼要吃猪,若狼吃掉一头猪,他不会再吃另一头猪,问狼可以吃掉的猪的最大数目分析: 狼与猪构成二分图,第i头狼能吃掉第j头猪,则g[i][j] = true即可建图,可以先预处理每一头猪和狼 的序号,然后再建图*/#include<cstdio>#include<cstring>#define X 105#define M 11char ch[M][M];intym[X],cal[2][M][M],n,m,nw,np;//int xm[X];booluse[X],g[X][X];bool dfs(int u){ for(int v=1;v< 阅读全文
posted @ 2012-04-07 16:04 yejinru 阅读(198) 评论(0) 推荐(0) 编辑
摘要:/*题目: 当一个洋娃娃的长宽高都比另一个大时,小的那个可以被套进去,问在最外面的洋娃娃的 最小个数分析: 求最大独立集,用娃娃总数-最大匹配即可,用两层循环先建图,每当娃娃i长宽高都比j小时, 则g[i][j] =true建图即可,开始时我竟然先对它进行排序,后来才发现是不用的。。。直接 两层循环再比较即可建图。求最大匹配就是纯粹的hungy算法*/#include<iostream>#include<cstring>#include<cstdio>using namespacestd;#define X 502intxm[X],ym[X],n,m;boo 阅读全文
posted @ 2012-04-07 16:03 yejinru 阅读(406) 评论(0) 推荐(0) 编辑
摘要:/*题目: 每头奶牛喜欢在不同的地方产奶,每个地方只能容纳一头奶牛,问最多的产奶的地方分析: 在产奶地与奶牛之间建立匹配,然后用hungry算法做,比如奶牛a喜欢在q地产奶,则 g[a][q] = true,建图即可*/#include<iostream>#include<cstdio>#include<cstring>using namespacestd;#define X 202intxm[X],ym[X],n,m;boolg[X][X],use[X];int dfs(int u){ for(int v=1;v<=m;v++) if(g[u][v] 阅读全文
posted @ 2012-04-07 16:02 yejinru 阅读(166) 评论(0) 推荐(0) 编辑
摘要:/*题目: 值班问题,给出所有人的空余时间,问能不能够在每一个时间里安排一个人值班分析: 二分匹配问题,按人与他的空余时间连线构图,然后就是hungry算法了,简单*/#include<iostream>#include<cstring>#include<cstdio>using namespacestd;#define X 22boolg[X][X],use[X];intxm[X],ym[X],k,p;bool dfs(int u){ for(int v=0;v<k;v++) if(g[u][v]&&!use[v]) { use[v] 阅读全文
posted @ 2012-04-07 16:00 yejinru 阅读(201) 评论(0) 推荐(0) 编辑
摘要:/*题目: 哈工大推出新的宿舍分配方案,当两人对A B题有相同答案的人可以分在A类宿舍, 对C D题有相同答案的人可以分在B类宿舍,每一间的宿舍人数没有限制的话,问可 以最少要分配多少间宿舍才能分好所有学生分析: 每一个学生都可以分配在A类宿舍i,或者B类宿舍j,因此,g[i][j] = true,由此可以 构造一个二分图,用hungry算法做 由于输入的数据比较大,若用两层循环判断的话,会超时,所以可以先排序,然后再判断 与前面的一不一样,若一样则置g[i][j] = true,i 和 j的值需要先处理好,具体看代码*/#include<iostream>#include< 阅读全文
posted @ 2012-04-07 15:56 yejinru 阅读(184) 评论(0) 推荐(1) 编辑
摘要:/*题目:下列区间可以在数轴上分成最少多少个区间块分析:这题主要是贪心的做法,对输入的区间按照左边的值进行排序后,然后开始向后枚举每个后面的区间的前边的值是否小于等于起初的最大能到右面的最大值,符合的话,在更新一下起初的能到达右面的最大距离,比如2-54-8的话,由于第一个的右值为5,而枚举到第二个区间时,4<5,而8比5大,所以又可以到达8,更新一下,具体看代码*/#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>usingnamespacestd; 阅读全文
posted @ 2012-04-06 15:42 yejinru 阅读(212) 评论(0) 推荐(0) 编辑
摘要:/*一般我们的做法都是正向思维,即先对横坐标排好序,再枚举横坐标的整点,然后贪心做,其实这样做是很费力的。可以逆向思维考虑一下: 最多只有1000的点,我们可以先预处理完以该点为圆心,半径为d的圆与横坐标的左右交点 (当然还可能只有1个,或者没有),然后分别储存到结构体的两个关键字中,然后尽量再枚举 后面的点的区间与前面的点的区间(两个关键字构成的区间)有交集(贪心,因为事先排好序), 再向后面延展的同时,使得雷达的数量最小化,直到遇到没有交集的点为止 (我的文字可能不清晰,具体看代码)*/#include <cstdio>#include <iostream>#inc 阅读全文
posted @ 2012-04-05 21:18 yejinru 阅读(164) 评论(0) 推荐(0) 编辑