8.3.1 棋盘覆盖问题

8.3.2 循环日程表问题

构造第一组解,然后剩下的对应第一组解构造即可。

8.3.3 巨人与鬼

按照y坐标排序,按照极坐标[0, PI)扫描范围的对应点。

8.3.4 非线性方程求根

c#include <stdio.h>

int main(int argc, const char *argv[])
{
    double a, c, x = 0, y = 100;
    int i, b;
    scanf("%lf%d%lf", &a, &b, &c);
    while(y-x > 1e-5)
    {
        double m = x + (y-x)/2;
        double f = a;
        for(i = 0; i <  b; i++) f += f*m/100 -c;
        if(f < 0) x = m;
        else y = m;
    }
    printf("%.3lf%%\n", x);
    return 0;
}

8.5.3 最大值最小化

二分区间和最小值,遍历数组。

c#include <stdio.h>

const int MAXN = 1000;
int a[MAXN];

int main(int argc, const char *argv[])
{
    int n, m;
    int maxn = 0, sum;
    while(~scanf("%d%d", &n, &m))
    {
        sum = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &a[i]);
            sum += a[i];
        }

        int x = 0, y = sum;
        int temp, less;
        int cnt, maxn;
        // temp = x 成立,则y = temp
        while(x < y-1)
        {
            cnt = m;
            less = 0;
            temp = x + (y-x)/2;
            sum = 0;
            for(int i = 0; i < n; i++)
            {
                sum += a[i];

                if(sum > temp)
                {
                    cnt --;
                    sum = a[i];
                    if(cnt == 0)
                    {
                        less = 1;
                        break;
                    }
                }

                else if(temp == sum)
                {
                    cnt --;
                    sum = 0;
                    if(cnt == 0 && i != n-1)
                    {
                        less = 1;
                        break;
                    }
                }
            }

            if(less) x = temp;
            else y = temp;
        }

        printf("%d\n", temp);
    }
    return 0;
}

svtter
209 声望37 粉丝

更喜欢原型开发


引用和评论

0 条评论