题目描述

JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物。萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感。于是,JYY决定从中挑选连续的一些礼物,但究竟选哪些呢?假设礼品店一共有N件礼物排成一列,每件礼物都有它的美观度。排在第i(1\leq i\leq N1≤i≤N)个位置的礼物美观度为正整数A_iAi​。JYY决定选出其中连续的一段,即编号为礼物i,i+1,…,j-1,ji,i+1,…,j−1,j的礼物。选出这些礼物的美观程度定义为:

(M(i,j)-m(i,j))/(j-i+k)(M(i,j)−m(i,j))/(j−i+k),其中M(i,j)M(i,j)表示max\{A_i,A_{i+1}....A_j\}max{Ai​,Ai+1​....Aj​},m(i,j)m(i,j)表示min\{A_i,A_{i+1}....A_j\}min{Ai​,Ai+1​....Aj​},K为给定的正整数。

由于不能显得太小气,所以JYY所选礼物的件数最少为L件;同时,选得太多也不好拿,因此礼物最多选R件。JYY应该如何选择,才能得到最大的美观程度?由于礼物实在太多挑花眼,JYY打算把这个问题交给会编程的你。

法一:用单调暴力求解,然后你就可以得到宝贵的20分(本人亲自实验)。

法二(正解):

若区间长度等于规定L,就直接用单调队列维护长度为L的区间的最大值和最小值,分别计算每个区间,用一个ans记录最大值。

若区间大于L,对于一个区间[l, r]很明显可以发现最优的取法是在A[l]为最小值, A[r]为最大值或A[l]为最小值,A[r]为最大值。

然后开始二分答案。

judge函数:

1, A[l] > A[r], 要A[l] - A[r] > (r - l + 1) * mid; 所以若max{A[i] + i * mid - (A[j] - j * mid) - k * mid} >= 0则mid可以更大

2,若A[l] < A[r] 同理,反过来就行。

所有A[i] + i * mid, A[j] - j * mid用单调队列来维护。

#include <bits/stdc++.h>
using namespace std;
const long long MAX = 500005;
const double INF = 1e9;
long long t, n, k, l, r;
long long a[MAX], q1[MAX], q2[MAX], q[MAX];
double val[MAX];
double ans;
//读入优化
double read() {double ret = 0, f = 1;char ch = getchar();while ('0' > ch || ch > '9') {if (ch == '-') f = -1;ch = getchar();}while ('0' <= ch && ch <= '9') {ret = ret * 10 + ch - '0';ch = getchar();}return ret * f;
}
//判断
bool judge(double m) {double ret = -INF;for (long long i = 1; i <= n; i++) {val[i] = a[i] - m * i;}long long head = 1, tail = 0;for (long long i = l + 1; i <= n; i++) {while (head <= tail && i - q[head] >= r) head++;while (head <= tail && val[q[tail]] >= val[i - l]) tail--;q[++tail] = i - l;ret = max(ret, val[i] - val[q[head]]);}for (long long i = 1; i <= n; i++) {val[i] = a[i] + m * i;}head = 1, tail = 0;for (long long i = n - l; i >= 1; i--) {while (head <= tail && q[head] - i >= r) head++;while (head <= tail && val[q[tail]] >= val[i + l]) tail--;q[++tail] = i + l;ret = max(ret, val[i] - val[q[head]]);}//k是题目给的常数 return ret >= k * m;
}
int main() {t = read();while (t--) {ans = -INF;n = read(), k = read(), l = read(), r = read();for (long long i = 1; i <= n; i++) a[i] = read();long long h1 = 1, h2 = 1, t1 = 0, t2 = 0;for (long long i = 1; i < l; i++) {while (h1 <= t1 && a[q1[t1]] >= a[i]) t1--;while (h2 <= t2 && a[q2[t2]] <= a[i]) t2--;q1[++t1] = q2[++t2] = i; }for (long long i = 1; i <= n; i++) {while (h1 <= t1 && i - q1[h1] >= l) h1++;while (h2 <= t2 && i - q2[h2] >= l) h2++;while (h1 <= t1 && a[q1[t1]] >= a[i]) t1--;while (h2 <= t2 && a[q2[t2]] <= a[i]) t2--;q1[++t1] = q2[++t2] = i;ans = max(ans, 1.0 * (a[q2[h2]] - a[q1[h1]]) / (l + k - 1));}//注意精度 double l = 0, r = 1000;while (r - l >= 0.000001) {double mid = (l + r) / 2;if (judge(mid)) ans = max(ans, mid), l = mid + 0.000001;else r = mid - 0.000001;}printf("%.4lf\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/zcr-blog/p/11440760.html

GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ相关推荐

  1. [COGS2652]秘术「天文密葬法」-长链剖分-01分数规划

    秘术「天文密葬法」 题目说明: 路径的长度是点数 所有整数都是正整数 已添加一句话题意 [题目描述] 永琳需要协助紫解决异变! 在某个满月的夜晚,幻想乡的结界出现了异常,虽然目前还没有找到原因,不过有 ...

  2. 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ

    [BZOJ4476][Jsoi2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排 ...

  3. 「BZOJ 3994」「SDOI 2015」约数个数和「莫比乌斯反演」

    题意 设\(d(x)\)为\(x\)的约数个数,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\). 题解 首先证个公式: \[d(ij) = \sum_{x|i}\sum_ ...

  4. JavaScript 红宝书第4版上市啦!「文末送几本给大家」

    文末有活动 人的一生中总要读几本经典书,在这个"经典"泛滥的年代,什么才是权威的代表,我想大概是一本的书的口碑,能积累下上佳口碑的书,往往也是能经得住时间推敲的.比如这本: 我相信 ...

  5. 「开发者说」自动化设备管理上钉钉,“源创食堂“小程序开发实践

    本篇文章的供稿人为柳州源创电喷技术有限公司装备开发部部长蒙东辉,概览本文大概需要3分钟,精读本文需要10分钟. "钉钉应用开发让公司食堂都实现了数字化转型,食堂备餐浪费与不足的现象得到了有效 ...

  6. 520情人节到了,作为程序猿的我用代码给女朋友送了一个礼物「可以拿去送给自己喜欢的人」

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  7. 先让爸爸做做测试,再送他父亲节礼物「Scratch单项选择题实现鼠标+键盘操作」

    ​一份问卷调查,期待听到您的声 在我们的语境里,说起父亲,能想到的形容词有哪些? 高大.沉默.严厉.深沉.忙碌-- 孩子读懂父亲,意味着成熟. 父亲节到了,学编程的孩子们准备给父亲送一件什么礼物呢? ...

  8. 「CH2401」送礼物 解题报告

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  9. JSOI 2015 送礼物

    [BZOJ4476] [JSOI2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都 ...

最新文章

  1. Kali Linux python 安装pip
  2. @程序员:Python 3.8正式发布,重要新功能都在这里
  3. 发明复制粘贴的那个人去世了
  4. DateTime.Now.Ticks.ToString()说明
  5. ASP.NET(c#)实现重定向的三种方法的总结
  6. Android 启动多个闹钟。
  7. 【机器学习笔记之八】使用朴素贝叶斯进行文本的分类
  8. java语言程序设计二级_计算机二级Java语言程序设计试题
  9. js模板引擎—art-template的使用
  10. 大龄程序员找工作,为什么这么难?能力与年龄不匹配
  11. Either your server has no Maven installations defined, or the requested Maven version does not exist
  12. 计算机基础长文档的排版,“WORD长文档排版技术
  13. 问题 : Day of Week
  14. 《沧浪之水》、《因为女人》作者阎真的最新作品《活着之上》的阅后笔记
  15. IAR安装与破解WIN7版本
  16. Java下载文件的四种方式详细代码
  17. js mouseover/mouseout不停地循环
  18. 华瑞IT教育学习java从零基础到实战经验
  19. Halcon实战记录之三《模板制作--两点定位》
  20. autocad2014免费中文版下载

热门文章

  1. 第七届蓝桥杯JavaA组国(决)赛部分真题
  2. java实现第七届蓝桥杯凑平方数
  3. Snap在2019年第三季度的每日活跃用户数有所增长,但其股价下跌5%
  4. 2020年最值得加入的互联网公司有哪些?
  5. LeetCode7.10 股票问题汇总 贪心,动态规划,排序
  6. 管家婆设置软件登录限制
  7. C#线程间操作无效:从不是创建控件“textbox1”的线程访问它
  8. 2010年国家规划布局内重点软件企业认定名单
  9. 山外多功能调试助手用作MM32虚拟示波器
  10. Python综合案例2(险种缴费记录管理)