POJ
文章平均质量分 66
琴空
北航软件学院本科二年级生,现在在学习ACM,分布式,网页制作。QQ:939582481
展开
-
poj4047 线段树
//poj4047 #include using namespace std;#define maxn 200100#define LL(x) (x<<1)#define RR(x) (x<<1|1)struct Seg { int l,r,v,c; int len() {return (r-l+1);}}a[maxn*3];void buildtree原创 2012-05-27 09:23:37 · 938 阅读 · 0 评论 -
poj1024 bfs
这题写的很苦手啊,详解见poj discuss.#include #include #include using namespace std;struct point{ int x,y;};int g[101][101][5],cas,n,m,k,x1[1010],x2[1010],y1[1010],y2[1010];int a[101][101],b[101][1原创 2012-01-16 21:50:45 · 1830 阅读 · 0 评论 -
poj1059 模拟
细心即可#include using namespace std;int p[7],dice[101],a[101],x,y,k,num,ans,mark[7],turn,player;void ex(int pp,int x) { if (a[x]==-2) mark[pp] = 1; else if (a[x]==-3) mark[pp] = 2; el原创 2012-01-07 16:10:16 · 971 阅读 · 0 评论 -
poj2362 dfs
给一些棍子,问能否围成一个正方形(必须全部用上)。这么写的DFS就TLE了:void dfs(int k,int id,int res) { if (k==5) { g = true; return; } for (int i=id;i<=n;i++) { if (!v[i] && res>=a[i]) {原创 2011-12-25 12:55:56 · 829 阅读 · 0 评论 -
poj 4020 逆序对
问了jx,才看懂了题意。 给定100000个二元组(x,y),找到一个排列,使得这个排列下x的逆序对数和y的逆序对数之和最小只要是相同颜色的就算一个 (1,2)(2,1)这种情况算一个。不知道我说没说清楚,嘴笨= =#include #include using namespace std;struct data { int a,b;}a[10原创 2011-12-14 22:00:23 · 847 阅读 · 0 评论 -
poj2996 模拟
#include #include #include #include using namespace std;struct data { int r,l; char ch;}chessw[65],chessb[65];string s;char ch,ch1;int totw,totb;map ma;void print1(data chess)原创 2011-12-13 09:53:22 · 1116 阅读 · 0 评论 -
poj2993 与2996相反的模拟
#include #include #include #include using namespace std;struct data { int r,l; char ch;}chess[65];string s;char ch,ch1,ch2;int tot,p,w;bool cmp(data a,data b) { if (a.r>b.原创 2011-12-13 10:20:59 · 845 阅读 · 0 评论 -
poj1568 极大极小搜索
问题:给出一个4x4 tic-tac-toe 的棋局的局面,问先手 "x" 是不是能找在接下来的一步中找到一个必胜局面,如果有,输出第一个落子位置(按顺序)。极大极小搜索策略一般都是使用在一些博弈类的游戏之中: 这样策略本质上使用的是深度搜索策略,所以一般可以使用递归的方法来实现。在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。 极小值和原创 2011-12-20 15:32:41 · 3010 阅读 · 2 评论 -
poj4003 树形dp, rmq_st
很综合的题目,出得非常好第一个问题是求以树中的每个节点为起点所能走的最长路:首先,求出各个点的最长路,次长路,以及最长路的后继节点,再据此得到答案第二个问题,需要rmq,并且维护一个队列,只要满足条件,队尾添加新元素,不然同时弹出队头注意!dfs函数中tmp2为根走另一分支所得次长路,与最长路无公共路径!#include using namespace std原创 2011-12-08 20:26:42 · 930 阅读 · 0 评论 -
poj2502 最短路
好久没做图论了,没想到感觉还是一级棒啊!现在觉得自己的状态太好了,希望能保持到下个ACM赛季。#include #include #include using namespace std;#define maxn 1010#define maxm 100010#define INF 100000000struct edge { int y,next;原创 2011-12-05 22:12:22 · 1446 阅读 · 0 评论 -
poj4001 象棋判断死局
福州第一题,模拟题,判断是否将死,都是最简单的情形。主要看细节,但是只要想清楚了,什么都是浮云。网上一位哥们写的比我清楚多了,分享一下。#include#include#includeusing namespace std;int ff[11][11];char map[11][11];bool inside(int x,int y)//判断坐标是否在棋局内{ i转载 2011-12-04 17:50:59 · 2586 阅读 · 1 评论 -
poj1020 暴搜暴的很有水平~
问题:几个小正方形是否能拼成一个大正方形(全部用上) discuss上写的那个果然经典。借鉴学习之。具体见注释。#include using namespace std;int state[41],x,cake[20],s,n,cas,sum;bool ans;void dfs(int dep) { if (dep==n) {原创 2011-11-30 21:50:11 · 2652 阅读 · 0 评论 -
poj1010 暴搜
四重循环爆菊之!#include #include using namespace std;int x,num,tot,kind,kk,kmax,hmax,n,stamp[110],best[5];bool tie,ans,v[110],hash[110];int cmp() { if (kind>kk) return 1; else if (kind==kk &原创 2011-11-29 17:31:54 · 1502 阅读 · 0 评论 -
poj3460 ida*
估价函数很经典,每个值的后继值错误的个数除以3。因为一次操作最多改变3个值的后继值。1A,IDA*已经写得很纯熟了。#include #include using namespace std;int a[25],n,bound,cas;int ans;int h(int *a) { int hv = 0; if (a[1]!=1) hv++; for (i原创 2011-11-28 21:08:12 · 1584 阅读 · 0 评论 -
poj1190 神剪枝啊
又见神剪枝啊,不加2*v/R+tmp>=ans这句话的话,是无法避免超时的它的意思是:当前解+剩余资源的最优解>=最优解时,剪枝,有点像a*的估价函数#include #include using namespace std;int R,H,n,m,ans,mv[21],tmp;void dfs(int v,int dep,int R,int H) { if (d原创 2011-11-27 10:29:09 · 3478 阅读 · 0 评论 -
poj1021 概率,最小表示
这个真的很强!网上找的:唯一的难点是,怎么判断连成一片的棋子形状相同? 一个基于概率的算法是:给每一颗棋子计算一个值,根据这个值是否相等来推测它所在的一片棋子的形状是否相等。计算出每颗棋子的值后对其进行排序,若两副棋盘生成的序列完全相等则推测其等价。 至于这个值如何定,我的设计为:每颗棋子在其水平方向和垂直方向与其相连的棋子总数+1(自己)。比如左图的C,这个值为水平相连2颗(AB原创 2012-01-16 23:59:53 · 2204 阅读 · 1 评论 -
poj1027 模拟
虽然不长,但仍写了很长时间……#include #include using namespace std;int cas,tmp,ans,tot,sum,k,x,y;bool v[11][16];string a[11];char c;int dx[4] = {0,1,0,-1};int dy[4] = {1,0,-1,0};void clear(int x,int y) {原创 2012-01-17 21:51:12 · 1521 阅读 · 2 评论 -
poj4044 白开水~
好久没刷题了,也好久没更新了。碰巧A了到新出的水题,便把题解放这吧。题意很简单,因此代码也很渣的= =#include #include using namespace std;int n,m,p1,p2,t,tmp,l,maxl,a[110],b[110],c[110];bool v[110];bool cmp1(int a,int b) { return a>b;}原创 2012-05-13 20:12:36 · 872 阅读 · 0 评论 -
poj2034 dfs
冯如杯完了,有时间可以惬意的刷几道了。这题是求n到m的一个排列,满足相邻的2个,3个……d个数的和都不为素数(都要满足)。然后上代码,挺简单,是所以发代码,是觉得自己写得比较漂亮。(呵呵,不要喷我)#include using namespace std;bool ans,p[10010],h[1010];int n,m,d,a[1010],sum[11];void dfs(i原创 2012-04-18 21:50:50 · 1672 阅读 · 0 评论 -
poj3026 bfs mst
挺综合的一题,就是空格有些无语,多亏discuss前辈们的指点。渣代码抛砖引玉。#include #include using namespace std;#define maxn 1010#define maxm 100010#define INF 100000000int cas,n,m;char s[110][110];struct edge { int原创 2012-03-13 20:54:50 · 1021 阅读 · 0 评论 -
poj3682 概率
几何分布:在第n次伯努利试验,才得到第一次成功的机率。详细的说,是:n次伯努利试验,前n-1次皆失败,第n次才成功的概率。P(X=k)=p*(1-p)^(k-1)EX=1/pDX=(1-p)/(p^2)巴斯卡分布可视作k个几何分布,如题意。EX=k/pDX=k*(1-p)/(p^2)原创 2012-03-06 16:07:07 · 1046 阅读 · 0 评论 -
poj2002 数正方形 hash
直接上渣代码了#include using namespace std;struct gtype { int x,y,next;}g[3000];int first[1000100],tot,n,x[3010],y[3010],ans,h,tx,ty;int hash(int x,int y) { return (40000*x+y+800040000)%999原创 2012-03-04 10:38:02 · 883 阅读 · 0 评论 -
poj3003&2397 DP 记录路径
这两题是一模一样的最近做了好多这种背包的题,但是这题需弄清的地方还是不少,有些绕f[][]数组其实是可以省的#include #define oo 10000000using namespace std;int cas,n,a[1010],p,q,dp[2][1010],pre[41][1010];bool f[2][1010],ans[41];int main() {原创 2012-03-02 11:01:43 · 1092 阅读 · 0 评论 -
poj3314 堆木块 模拟
往箱子里堆木块,放满一个箱子(比它的高度高),则接着从一个新箱子开始放,求每个箱子木块的高度。#include using namespace std;struct data { int up[11],down[11],h;}a[101];int n,w,b,t,now,tot,tmp,ans[101];bool empty;char s[101][11];int原创 2012-02-21 09:44:41 · 771 阅读 · 0 评论 -
poj3311 状态压缩
和2817很像虽然短小,但是很典型,故作文以记之。求全排列后的最优值。dp[i][j]表示状态为j时,第i个为最后添加的 时的最优值#include using namespace std;#define oo 10000000int p[11]={1,2,4,8,16,32,64,128,256,512,1024};int g[11][11],dp[11][1026],n原创 2012-02-19 20:04:37 · 1061 阅读 · 0 评论 -
poj1717 DP
A得很艰辛啊,虽然看上去很简单,但还是要整理好思路,而且有很多地方要注意细节!#include #include using namespace std;#define oo 10000000int gap,x,y,a[1010],dp[12010][2],p,q,j,jl,n;int main() { while (~scanf("%d",&n)) {原创 2012-02-27 19:31:04 · 1391 阅读 · 1 评论 -
poj 1570 floyd
这题过的人很少,却意外的很水呢#include #include #include using namespace std;char ch;int k1,k2,a[201][201][2],tot,g;string s,ss;map ma;int gcd(int a,int b) { if (b==0) return a; else return gcd(b,a原创 2012-02-25 20:38:46 · 661 阅读 · 0 评论 -
poj1293 DP背包
两种物品,放到n个盒子,要求所有盒子放满,且每个盒子只有一种物品,物品可以有剩余解法:将盒子视为物品,第一种物品为背包大小,进行DP并且记录路径,回溯可得放第一种物品的最优方案(目的是为了是放第二种物品的盒子总容积尽可能小),最后在判断一下就行了。#include using namespace std;int M,L,c[1010],dp[1010],n,pre[1010],sum,原创 2012-02-25 16:41:57 · 825 阅读 · 0 评论 -
poj1703 并查集
我真的是太弱了,想得很复杂,最后网上一看,原来这么简单的想法就搞定了……#include using namespace std;int f[200001],n,m,x,y,cas;char c;int find(int x) { if (x!=f[x]) f[x] = find(f[x]); return f[x]; }void Union(int x,int y原创 2012-01-31 11:15:25 · 928 阅读 · 0 评论 -
poj1042 贪心
整个一挫题。我用优先队列贪心,需注意的是排序,以及湖的鱼数小于等于零时为零。#include #include using namespace std;struct data { int f,d,id;}a[30],b;int n,t,tran[30],x,ans,maxi,save[30],tmp[30],tt;priority_queue q;bool o原创 2012-01-21 16:06:09 · 3349 阅读 · 0 评论 -
poj1037 DP
转载:http://archive.cnblogs.com/a/2122079/up[n][k] 长度为n以k开始的,前两个数呈上升趋势的数列的个数down[n][k] 长度为n以k开始的,前两个数呈下降趋势的数列的个数up[n][k] = sigma(down[n-1][i]) kdown[n][k]= sigma(up[n-1][i])转载 2012-01-20 11:14:28 · 1930 阅读 · 0 评论 -
poj1033 磁盘碎片
模拟磁盘碎片整理,写的晕了~方法:能移就移,不然处理其所在链或环#include using namespace std;int v[10010],id[10010],m,n,k,tot,x,r;bool loop,f;int main() { while (~scanf("%d%d",&m,&n)) { tot = 0; memse原创 2012-01-18 11:00:34 · 1474 阅读 · 0 评论 -
poj2331 ida*
用最少的管子数,连接平面上的两点,只允许横放或竖放,允许交叉或重叠方法:先搜x轴,再搜y轴预处理估价函数还是觉得很唯美~#include #include #include using namespace std;struct data { int l,num;}a[10];int n,sx,sy,tx,ty,h1[1010],h2[1010],total原创 2011-11-26 10:36:03 · 1367 阅读 · 0 评论 -
poj2286 唯美的IDA*(80行)
ida*果然比a*强太多了,少了hash判重和堆维护,是估价函数和DFS的完美结合啊!嗯,主要是DFS函数中第二行的那个强剪枝太给力了!IDA*的灵魂啊!基本的架构就是如此了,可以任意套。//poj2286#include #include using namespace std;const int b[5][8] = { 7,8,9,12,13,16,17,18,原创 2011-11-24 22:13:39 · 2543 阅读 · 1 评论 -
poj2560 kruscal
<br />只看看数据就知道怎么回事了,花5分钟又写了遍kruscal,的确经典!<br />#include <iostream>#include <algorithm>#include <cmath>using namespace std;struct point { double x,y;}p[110];struct edge { int x,y; double c;}a[10010];int n,tot,i,j,k1,k原创 2011-03-09 14:25:00 · 665 阅读 · 0 评论 -
poj2531 对称性剪枝
<br />刚开始把n看成10000了, 汗<br />题意,给一个完全图,求最大割。据说这是一个NP难的问题<br />第一次写对称性剪枝<br />scanf才过,而且找最大值必须这样写==<br />随机化也行<br />//poj2531#include <iostream>using namespace std;int n,i,j,t,a[21][21],ans;bool v[21];void dfs(int k, int s) { int i; if原创 2011-03-08 21:37:00 · 1061 阅读 · 0 评论 -
poj1350 一个模拟
一个很有意思的结论,给出一个四位数,若每位不都是一样的,各个位从大到小,从小到大排,再相减。如此循环,最后一定是以0或6174结束。注意,若不是四位数,直接判断no。#include #include using namespace std;bool same(string s) { bool f=true; for (int i=1;i原创 2011-02-20 20:41:00 · 728 阅读 · 0 评论 -
poj1329 解析几何-三角形求外接圆
<br />poj1329,三角形求外接圆。<br />貌似没有0的问题。<br />由于自己的不小心,差点被此题搞死,还好ac了。<br />#include <iostream>#include <cmath>using namespace std;const double eps=1e-10;struct point { double x,y;}p[3];struct line { //点斜式存直线 bool f;//是否存在斜率原创 2011-02-20 15:47:00 · 1129 阅读 · 0 评论 -
poj2506 dp
<br />dp[i]=dp[i-2]*2+dp[i-1];<br />//poj2506#include <iostream>#include <algorithm>using namespace std;struct numtype { int len,a[1000];}dp[252];int n;void add(numtype a, numtype b, numtype &c) { int i,len=max(a.len,b.len);原创 2011-03-07 16:41:00 · 1423 阅读 · 0 评论 -
poj2260
<br />#include <iostream>using namespace std;int n,x[110],y[110],i,j,t,a1,ai,a2,aj;int main() { while (cin >> n && n) { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); for (i=1;i<=n;i++) for (j=1;j<=原创 2011-03-03 21:46:00 · 645 阅读 · 0 评论