计算几何与数学博弈
mig_davidli
稍微明白点算法和C++,参加过几个小项目。。
展开
-
【多校练习4签到题】HDU 4642—— Fliping game
来源:点击打开链接看上去很难,比赛的时候光看hehe了,也没有想。但是仔细想想,是可以想出来的。一个棋盘上每个格子摆放一个硬币,硬币有正面1和反面0之分。现在两个人可以按照规则翻硬币,选择(x,y),要求(x,y)的硬币必须是正面,那么从(x,y)向右下角所有的硬币都被翻转。知道某个人无法翻(所有硬币都是反面)为止,这个人判输。有一种特殊情况,那就是右下角,每次都被反转。无论如原创 2013-08-04 11:22:07 · 1235 阅读 · 0 评论 -
【暴力+排除法】FZU 2148 Moon Game
比赛地址:点击打开链接比赛做粗的4个题几乎都是水,感觉弱的水爆炸了。这个题最初的思路是枚举找出四个点,做凸多边形的模板判断。C(30,4)。结果答案不对。。后来发现模板上是要求点对的顺序是逆时针或顺时针输入。于是用时钟排序的函数排序后判断:bool cmp(point p1, point p2){ return atan2(p1.y, p1.x) < atan2(p2原创 2014-05-08 16:05:46 · 2490 阅读 · 0 评论 -
【暴搜博弈+记忆化搜索神题】 UVA 10838——The Pawn Chess
The Pawn ChessInput: Standard InputOutput: Standard OutputConsider the following mini-version of chess: We have a 4x4 chessboard, with four white pawns on the first rank (bottom line in the inpu翻译 2013-04-05 12:05:27 · 1131 阅读 · 0 评论 -
【欧几里得响彻群山】CodeForce 7C—Line
题目来源:点击打开链接判断一个线性方程组Ax+by+C=0是否有整数解,如果有,则输出整数解。这个问题用到了欧几里得扩展求逆元的算法。用这个算法可以求 X mod b=m 这种模线性方程(求的是X的通解,整数解)。变形一下,得 X+by=m,其中y为整数。通常写成 ax+by=m 的形式,然后解得x的通解,进而得到X=ax的通解。其实就是在求GCD(a,b)的同时把解出满足 ax+原创 2012-12-17 09:52:46 · 989 阅读 · 0 评论 -
【给小学奥数跪了-Pick公式与欧几里德算法】poj1265—Area
这个题最早的来源是小学奥数,六年级的时候,我们学到了格点的面积……求格点内的面积公式,又叫PICK公式。当然我只能呵呵了,完全不记得有这个公式……由上图得,S=N+L/2-1,N属于格子内的点,L属于边划过的格子。INPUT给的是绘图路径而不是坐标,所以说需要转化成坐标,求擦过边的点,可以用GCD(点A,点B)来实现,可以用史上最古老的算法——欧几里德算法,LOG(N)的效率。现在原创 2012-11-12 21:02:45 · 1306 阅读 · 0 评论 -
【1级裸装没点技能点的计算几何】任意多边形面积-HDU2036
从任意三点的公式延伸出来的计算函数,因为任意多边形都可以拆成很多个三角形。。。。。S(a,b,c)=|y1,y2,y3|*0.5=[(x1-x3)*(y2-y3)-(x2-x3)*(y1-y3)]*1/2;按顺时针排列的话是正的,PS:这货不是海伦公式,海伦公式在ACM里不好用。求逆时针的点的面积,很简单,加个负号就是了。。#include #include using nam原创 2012-11-07 20:36:43 · 633 阅读 · 0 评论 -
【矩阵乘法再实践】HDU 2604——queuing
题目:点击打开链接首先,这是一个递推问题。mm结尾的只能由fm结尾的或者mm结尾的推来。以mf结尾的只能由mm结尾的推来,以fm结尾的只能由mf或者ff推来,以ff结尾的只能由mf推来。F(n)=F(n-1)+F(n-3)+F(n-4)。可是正常用大数的话会TLE。后来查阅DISCUSS得知应该使用矩阵乘法。其中1——4是已知的。其中这个A矩阵是要构建的,一般是通过0-1阵,达到下原创 2013-02-22 16:25:26 · 893 阅读 · 0 评论 -
【找规律】CodeForce #258 Problem A——Game With Sticks
来源:点击打开链接很简单,找规律。每去掉一个点,点的总数量就减去n+m-1,然后看谁最先减到没有点可减,就可以了。#include #include using namespace std;int main(){ int n,m; cin>>n>>m; int totalpoint=n*m; int count=0; while(totalpoint>0) {原创 2014-07-25 18:41:24 · 2300 阅读 · 0 评论