博客
关于我
[bzoj3203][三分]保护出题人
阅读量:95 次
发布时间:2019-02-26

本文共 2032 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到每一关植物攻击力的最小总和。我们可以通过数学建模和单调栈的方法来高效解决这个问题。

方法思路

  • 问题分析:每一关有多个僵尸,每个僵尸的血量和位置不同。我们需要计算每一关的植物攻击力,最终求所有关的攻击力总和的最小值。
  • 数学建模:每一关的植物攻击力可以看作是点集中的最大斜率。通过前缀和数组,我们可以将问题转化为找出最大斜率的问题。
  • 单调栈:使用单调栈来维护下凸包,确保每次加入新点时,栈中的点集是下凸的。这样,我们只需要在栈顶中查找最大斜率即可。
  • 解决代码

    #include 
    #include
    #include
    #include
    #include
    using namespace std;
    struct pt {
    double x, y;
    };
    double slope(const pt &u, const pt &v) {
    return (v.y - u.y) / (v.x - u.x);
    }
    double main() {
    int n, D;
    scanf("%d %d", &n, &D);
    double *s = new double[n + 1];
    for (int i = 1; i <= n; ++i) {
    double A, X;
    scanf("%lf %lf", &A, &X);
    s[i] = s[i - 1] + A;
    }
    pt *sta = new pt[2 * n];
    int top = 0;
    for (int T = 1; T <= n; ++T) {
    double A, X;
    scanf("%lf %lf", &A, &X);
    sta[top].x = D * T;
    sta[top].y = s[T - 1];
    while (top > 0 && slope(sta[top - 1], sta[top]) >= slope(sta[top], sta[top + 1])) {
    top--;
    }
    sta[top + 1].x = X + D * T;
    sta[top + 1].y = s[T];
    int l = 1, r = top;
    while (r - l > 3) {
    int mid = (l + r) / 2;
    int mmid = mid + 1;
    if (slope(sta[mid], sta[top + 1]) > slope(sta[mmid], sta[top + 1])) {
    l = mid;
    } else {
    r = mmid - 1;
    }
    }
    int op = l;
    for (int i = l + 1; i <= r; ++i) {
    if (slope(sta[i], sta[top + 1]) > slope(sta[op], sta[top + 1])) {
    op = i;
    }
    }
    if (op != l) {
    ans += slope(sta[op], sta[top + 1]);
    } else {
    ans += 0;
    }
    }
    printf("%.0lf\n", round(ans));
    delete[] sta;
    delete[] s;
    return 0;
    }

    代码解释

  • 输入处理:读取输入数据,包括关数n和距离d,然后读取每一关的血量和位置。
  • 前缀和数组:计算前缀和数组s,用于后续斜率计算。
  • 下凸包维护:使用单调栈维护下凸包,确保每次加入新点时,栈中的点集是凸的。
  • 斜率计算:计算每一关的最大斜率,并累加到总和中。
  • 输出结果:输出最小总和,保留到整数部分。
  • 这种方法通过数学建模和单调栈优化,有效地将问题复杂度降低,确保了在较大数据量下的高效计算。

    转载地址:http://tsmu.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现获取HID设备列表 (附完整源码)
    查看>>
    Objective-C实现获取文件头的50个字符(附完整源码)
    查看>>
    Objective-C实现获取本机ip及mac地址(附完整源码)
    查看>>
    Objective-C实现获取本机系统版本(附完整源码)
    查看>>
    Objective-C实现重载[ ](附完整源码)
    查看>>
    Objective-C实现随机图生成器算法(附完整源码)
    查看>>
    Objective-C实现高斯消元法(附完整源码)
    查看>>
    Objective-C语法之代码块(block)的使用
    查看>>
    Objenesis创建类的实例
    查看>>
    OC Xcode快捷键
    查看>>
    OC 内存管理黄金法则
    查看>>
    OfficeWeb365 SaveDraw 文件上传漏洞复现
    查看>>
    office中的所有content type
    查看>>
    office之Excel 你会用 Ctrl + E 吗?
    查看>>
    OGG初始化之使用数据库实用程序加载数据
    查看>>
    ogg参数解析
    查看>>
    Oil Deposits
    查看>>
    OJ中处理超大数据的方法
    查看>>
    OJ中常见的一种presentation error解决方法
    查看>>
    OK335xS UART device registe hacking
    查看>>