随笔 - 68  文章 - 57  trackbacks - 0
<2024年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(8)

随笔分类(74)

随笔档案(68)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

先把题目贴出来,总结再说:
POJ 2234 Matches Game
HOJ 2533 Stone II
POJ 2975 Nim
HOJ 1367 A Stone Game
POJ 2505 A multiplication game
ZJU 3057 beans game
POJ 1067 取石子游戏
POJ 2484 A Funny Game
POJ 2425 A Chess Game
POJ 2960 S-Nim
POJ 1704 Georgia and Bob
POJ 1740 A New Stone Game
POJ 2068 Nim
POJ 3480 John
POJ 2348 Euclid's Game
HOJ 2645 WNim
POJ 3710 Christmas Game
POJ 3533 Light Switching Game
posted @ 2009-05-31 21:53 sdfond 阅读(825) | 评论 (0)编辑 收藏
  高斯消元法用于求解线性方程组,采用选主元的方法,算法复杂度O(N ^ 3)。相应的题型一种是在实数域进行求解,一种是在整数域求解,一般涉及到取模。实数域的求解比较简单,整数域需要注意几个问题。模p一定是素数,因为不是素数的话求解的时候可能会出现多个解,处理起来比较麻烦。一个特殊的情况是模2域下的求解,可以采用位运算优化。还有一点要注意的是在最开始构造系数矩阵和增广矩阵的时候,一定要先模p,否则选主元的时候一些模p为0的系数会被误选。
  高斯消元法另一个需要讨论的地方就是解的情况。分为无解、唯一解和无穷解。这三种情况根据线性代数的知识很容易判断,主要就是看系数阵的秩和增广阵的秩。如果某一次选主元发现当前列的系数都为0,那么对应的变量是一个自由变元,解不确定。这个时候要跳过这一列,保持行不变,继续进行消元。在消元之后查看增广阵的秩确定是否无解,若有解再根据自由变元是否存在来判断是否是唯一解。
  如果解是无穷多个的时候,需要枚举变元的取值。一般用于处理解空间很小的情况,比如在模2域上的求解。枚举变元后无需重新列方程,只需进行一次回带找解即可。
posted @ 2009-05-26 17:13 sdfond 阅读(470) | 评论 (0)编辑 收藏
  题目不难,就是给定一个w * h的纸,中间切一刀,切出来的两个矩形,从一个中剪下一个圆做圆柱的底,然后让另一个弯起来套住底,做柱面,最后求能形成的最大体积。
  练习的时候做了一下,总是WA。后来仔细想了一想,发现要讨论几种情况。首先要确保圆的直径要不大于w,之后因为弯曲矩形可以有两种方式,要分别讨论。一种是高为w,这样只需底面直径越大越好。一种是高不定,这时候需要列一个方程,求出极值点。可以证明极值就是极大值。但是要注意的是底面圆直径是有范围的,要注意极值点是否落在范围内。如果不在,由于极值点左侧单调递增,那么取直径为w就是这种情况的最优解。
  这种题目比赛的时候很容易出错,需要静下心来仔细想好才行,这方面能力以后还要多多锻炼。
题目代码:
#include <iostream>
#include 
<cmath>
using namespace std;
const double pi = acos(-1.0), eps = 1e-6;

int main()
{
    
double w, h, s, d;

    
while (scanf("%lf %lf"&w, &h) == 2)
    {
        
if (fabs(w) < eps && fabs(h) < eps)
            
break;
        
if (h < w)
            swap(w, h);
        d 
= h / (pi + 1);
        d 
= min(d, w);
        s 
= pi * d * d * 0.25 * w;
        d 
= 2.0 * h / 3.0;
        
if (pi * d <= w)
        {
            d 
= min(d, w);
            s 
= max(s, pi * h * h * h / 27.0);
        }
        s 
= max(s, w * w * (pi * h - w) / (4 * pi * pi));
        printf(
"%.3lf\n", s);
    }

    
return 0;
}
posted @ 2009-05-25 16:10 sdfond 阅读(282) | 评论 (0)编辑 收藏

  龙贝格积分的基本思想就是先利用复化梯形公式把曲线划分若干小区间,把每个小区间当成梯形来求和;然后每次将区间数加倍,直到收敛到一定精度范围内为止。
  程序基本参照计算方法的书写的,但是开始写完之后发现巨慢。找了网上一个版本和我的比较下,发现我们俩只是二维数组的两个维代表的含义互换了,但是时间复杂度完全相同。后来改了一下发现居然快很多,囧。之后可以过JOJ 2457。但是仍然过不了HOJ 2539。一旦把精度调高就TLE,郁闷。
  后来找到了liuyu大牛曾经写过的romberg积分模板,发现巨快,研究了一下发现他把那个T数组巧妙的压缩成了一维,但是总时间复杂度不变,不知道为什么那么快,也许是因为二维数组遍历的时候寻址比较耗时间吧。按照他的方法改了下,仍然过不了,但是这回是WA。找了很久发现在更新的时候每次乘以定值就会WA,用pow才可以过,估计是数据的精度有问题。改了之后终于过了,速度很快:-)

posted @ 2009-05-20 19:56 sdfond 阅读(938) | 评论 (0)编辑 收藏
  对于两个n阶多项式的乘法,如果模拟做的话复杂度为O(n^2),利用快速傅里叶变换可以把复杂度降到O(nlogn)。
  多项式有两种表示:系数形式和点值表示。如果把两个多项式写成点值形式,那么相乘的复杂度就是O(n)的。FFT的基本思想就是通过把系数形式化成点值形式,相乘之后再化回来,使得复杂度降到O(nlogn)。具体就是先通过巧妙地选取n个复数单位根,利用复数的一些非常好的性质求得DFT,把这一步的复杂度降到O(nlogn),然后将得到的点值相乘后,利用插值再变换成系数形式。插值的过程居然和求DFT的过程惊人的相似,复杂度依然为O(nlogn)。
  在实现的时候基本参照算法导论,感觉递归不太好写,就写了个迭代的。N久不用复数了,连基本运算都忘了,导致实现的时候出了一堆错,后来好不容易写好了,结果却一点都不靠谱。查了好久才发现,初始w是1的时候,我把实部和虚部都设成1了,囧。实际上虚部应该是0。改完后发现多项式的表示又出了问题,后来发现我把系数的顺序写反了。然后利用这个做了HDU 1402,就是高精度乘法。WA了几次,很抓狂。后来写了一个程序跑了一组极限数据,居然挂了。仔细观察后发现是精度的问题。因为FFT中间运算过程都是浮点数,但是最后要输出整数,取整的时候舍入精度出了问题,加了1e-3之后过了。
  还有一道比较巧妙的FFT的题目,SRM 436 DIV 1 1000pt,做的时候开始Z0忘记取模了,结果还以为是模板的问题,找了很长时间才发现。做题还是要细心啊。
posted @ 2009-05-18 16:01 sdfond 阅读(524) | 评论 (0)编辑 收藏
仅列出标题
共14页: First 6 7 8 9 10 11 12 13 14