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;

    }

};

 

你可能感兴趣的:(div)