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

本文共 1978 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    Navicat 设置时间默认值(当前最新时间)
    查看>>
    navicat 连接远程mysql
    查看>>
    navicat:2013-Lost connection to MySQL server at ‘reading initial communication packet解决方法
    查看>>
    Navicate for mysql 数据库设计-数据库分析
    查看>>
    Navicat下载和破解以及使用
    查看>>
    Navicat中怎样将SQLServer的表复制到MySql中
    查看>>
    navicat创建连接 2002-can‘t connect to server on localhost(10061)且mysql服务已启动问题
    查看>>
    Navicat可视化界面导入SQL文件生成数据库表
    查看>>
    Navicat向sqlserver中插入数据时提示:当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值
    查看>>
    Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
    查看>>
    Navicat如何连接MySQL
    查看>>
    navicat导入.sql文件出错2006- MySQLserver has gone away
    查看>>
    Navicat导入海量Excel数据到数据库(简易介绍)
    查看>>
    Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)
    查看>>
    navicat工具查看MySQL数据库_表占用容量_占用空间是多少MB---Linux工作笔记048
    查看>>
    navicat怎么导出和导入数据表
    查看>>
    Navicat怎样同步两个数据库中的表
    查看>>
    Navicat报错connection is being used
    查看>>
    Navicat报错:1045-Access denied for user root@localhost(using passwordYES)
    查看>>
    Navicat控制mysql用户权限
    查看>>