SRM 587 DIV1

要掉到DVI2了。。好不容这次的250那么简单,500的题知道怎么做,可惜没调出来500

250的题很简单,从第1步到第N步,每次要么不做,要么走i步,且X不能走,问说最远走多远。

#include <iostream>
#include <vector>
#include <string>
#include <string.h>
using namespace std;

class JumpFurther {
public:
    int furthest(int N, int badStep) {
        int sum = 0;
        for (int i = 1; i <= N; i++) {
            sum += i;
            if (sum == badStep) {
                sum--;
            }
        }
        return sum;
    }
};

500的题,用g(i)表示不重叠的面积和,n(i)表示异或后的一层的面积和,则最后的答案n(0)+n(2)+...,最重要的发现是g(i)=(w + 1 - i) * f(i) - (w - i) * f(i + 1),f(i)表示一层中的一个三角形的面积,还个重点是分析出对角线被分割的比例,那个比例可以转换为宽度的比。

#include <iostream>
#include <vector>
#include <string>
#include <string.h>
using namespace std;

class TriangleXor {
public:
    int w;
    double h(int i) {
        return w * 1.0 / (w + i);
    }
    double f(int i) {
        return w * h(i) / 2.0;
    }
    double g(int i) {
        if (i > w) {
            return 0;
        }
        return (w + 1 - i) * f(i) - (w - i) * f(i + 1);
    }
    double n(int i) {
        return g(i) - g(i + 1);
    }
    int theArea(int W) {
        w = W;

        double s = 0;
        for (int i = 0; i <= w; i += 2) {
            s += n(i);
        }

        return (int)s;
    }
};

 

posted @ 2013-08-02 14:11  litstrong  阅读(359)  评论(4编辑  收藏  举报