要掉到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; } };