摘要: 题意:Alice和Bob在玩一个游戏,该游戏需要n个杯子和一个石头,开始时石头被罩在在某个杯子里,Alice可交换任意两个杯子,经过一系列的交换,由Bob猜石头在哪个杯子里,交换总共m步,但Bob只看到了其中的k步,问Bob猜哪个杯子的可能性最大。第一感觉就是和组合(在n个数里取m个有多少种)很相似,再看题目因为顺序是一定的,即选了k步之后,顺序只有一种。c[n][m]=c[n-1][m-1]+c[n-1][m];具体编码的时候只考虑到交换的两个杯子而忘记其他杯子在选择时的值也要加上c[n-1][m-1];#include<cstdio>#include<cstring> 阅读全文
posted @ 2012-04-25 17:21 蚀 阅读(730) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个集合,有两种操作,插入一个数和查询集合中第i小的数,i每次查询一次前自增1,初始为0.一开始想先离散化,再用桶来表示这个集合,用树状数组维护查询,后来发现实现起来相当麻烦,而且思路也不够清晰。一看discuss居然有人用线段树做,简单多了,查询和插入都是O(logn);复杂度:O(nlogn);#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 30010using namespace std;struct ST{ int l,r,v;//v保存是的左子树有多少个数} 阅读全文
posted @ 2012-04-25 14:59 蚀 阅读(621) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个长方形区域用n条直线分隔成n+1个部分,给定m个点,求这个区域的m个点,求点所在的部分。算法:二分搜索,点和直线的位置关系1,设直线的方程ax+bx+c=0(a>0);若点(x0,y0)代入方程: 若ax0+by0+c<0,则点在直线的左侧; 若ax0+by0+c=0,则点在直线上; 若ax0+by0+c<0,则点在直线的右侧; 但是前提是a>0,否则结果左右对调(WA了一次).2,(x1,y1)和(x2,y2)为某直线的两个点,直线的方程就可以表示为(y2-y1)(x-x1)-(x2-x1)(y-y1)=0; 因为n较大,而直线与直线对点具有序的关系,即点 阅读全文
posted @ 2012-04-22 16:18 蚀 阅读(364) 评论(0) 推荐(0) 编辑
摘要: 表达式求值.程序套用的是poj 2252Equation Solver的标程,写的相当漂亮,简洁所有的表达式求值问题都可以用这种方法解决算法:ELL(1)-Parser2106 Boolean Expressions范式:Expression := Term { ('+' | '-') Term }Term := Factor { '*' Factor }Factor := Number | 'x' | '(' Expression ')'Number := Digit | Digit Number 阅读全文
posted @ 2012-04-17 20:38 蚀 阅读(1057) 评论(0) 推荐(0) 编辑
摘要: 加入收藏 | 设为首页<a href="javascript:;" onClick="window.external.AddFavorite(location.href,document.title)">加入收藏</a> |<a href="javascript:;"onclick="this.style.behavior='url(#default#homepage)';this.setHomePage(location.href);">设为首页</a&g 阅读全文
posted @ 2012-03-29 21:01 蚀 阅读(6804) 评论(0) 推荐(0) 编辑