[BZOJ4476] [JSOI2015]送礼物

Description

JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物。

萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感。于是,JYY决定从中挑选连续的一些礼物,但究竟选哪些呢?

【问题描述】

假设礼品店一共有N件礼物排成一列,每件礼物都有它的美观度。排在第i1< =i< =N个位置的礼物美观度为正整数Ai,。JYY决定选出其中连续的一段,即编号为礼物i,i+1,…,j-1,j的礼物。选出这些礼物的美观程度定义为

(M(i,j)-m(i,j))/(j-i+k)

其中M(i,j)表示max{Ai,Ai+1....Aj},m(i,j)表示min{Ai,Ai+1....Aj},K为给定的正整数。

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

Input

本题每个测试点有多组数据。输入第一行包含一个正整数T(T< =10),表示有T组数据。

每组数据包含两行,第一行四个非负整数N,K,L,R(2< =L< =R< =N。第二行包含N个正整数,依次表示A1,A2....An,(Ai< =10^8),N,K< = 50,000

Output

输出T行,每行一个非负实数,依次对应每组数据的答案,数据保证答案不会超过10^3。输出四舍五入保留4位小数。

Sample Input

1

5 1 2 4

1 2 3 4 5

Sample Output

0.7500

题解:

一道分数规划的题目。

RMQ问题我使用的ST表维护。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const double eps=1e-5;
  5. const int maxn=100010;
  6. const double INF=1e8;
  7. int n,k,l,r;
  8. int a[maxn],lg[maxn];
  9. int f[18][maxn];
  10. double f1[18][maxn],f2[18][maxn];
  11. int read()
  12. {
  13. int ret=0,f=1; char gc=getchar();
  14. while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
  15. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  16. return ret*f;
  17. }
  18. int getsum(int l,int r)
  19. {
  20. int k=lg[r-l+1];
  21. return min(f[k][l],f[k][r-(1<<k)+1]);
  22. }
  23. double getsum1(int l,int r)
  24. {
  25. int k=lg[r-l+1];
  26. return min(f1[k][l],f1[k][r-(1<<k)+1]);
  27. }
  28. double getsum2(int l,int r)
  29. {
  30. int k=lg[r-l+1];
  31. return min(f2[k][l],f2[k][r-(1<<k)+1]);
  32. }
  33. bool check(double mid)
  34. {
  35. double ret=-INF;
  36. for(int i=1;i<=n;i++)
  37. {
  38. f1[0][i]=a[i]-mid*i;
  39. f2[0][i]=a[i]+mid*i;
  40. }
  41. for(int j=1;(1<<j)<=n;j++)
  42. for(int i=1;i+(1<<j)-1<=n;i++)
  43. {
  44. f1[j][i]=min(f1[j-1][i],f1[j-1][i+(1<<j-1)]);
  45. f2[j][i]=min(f2[j-1][i],f2[j-1][i+(1<<j-1)]);
  46. }
  47. for(int i=1;i<=n;i++)
  48. {
  49. if(i>=l)
  50. ret=max(ret,f1[0][i]-getsum1(max(1,i-r+1),i-l+1));
  51. if(i<=n-l+1)
  52. ret=max(ret,f2[0][i]-getsum2(i+l-1,min(n,i+r-1)));
  53. }
  54. for(int i=1;i<=n;i++)
  55. ret=max(ret,a[i]-getsum(max(1,i-l+1),min(n,i+l-1))-mid*(l-1));
  56. if(ret>=k*mid)
  57. return 1;
  58. else
  59. return 0;
  60. }
  61. int main()
  62. {
  63. freopen("gift.in","r",stdin);
  64. freopen("gift.out","w",stdout);
  65. int T=read();
  66. while(T--)
  67. {
  68. n=read(),k=read(),l=read(),r=read();
  69. for(int i=1;i<=n;i++)
  70. f[0][i]=a[i]=read();
  71. for(int i=2;i<=n;i++)
  72. lg[i]=lg[i>>1]+1;
  73. for(int j=1;(1<<j)<=n;j++)
  74. for(int i=1;i+(1<<j)-1<=n;i++)
  75. f[j][i]=min(f[j-1][i],f[j-1][i+(1<<j-1)]);
  76. double ll=0,rr=1e8,mid;
  77. while(rr-ll>eps)
  78. {
  79. mid=(ll+rr)/2;
  80. if(check(mid))
  81. ll=mid;
  82. else
  83. rr=mid;
  84. }
  85. printf("%.4lf\n",ll);
  86. }
  87. return 0;
  88. }

JSOI 2015 送礼物的更多相关文章

  1. BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列

    BZOJ_4476_[Jsoi2015]送礼物_01分数规划+单调队列 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店很神奇,所有出售的 ...

  2. CH2401 送礼物(双向dfs)

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

  3. P1340 送礼物

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了. ...

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

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

  5. [TYVJ2340] 送礼物 - 双向搜索

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到 ...

  6. [BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表)

    [BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表) 题面 给出n,k,l,r和序列a,要求从a中选一段连续的区间[i,j]出来,使得M(i,j)-m(i,j)/(j-i+k) ...

  7. TYVJ1340 送礼物

    P1340 送礼物 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后 ...

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

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

  9. 「JSOI2015」送礼物

    「JSOI2015」送礼物 传送门 看到这题首先想到分数规划. 我们发现对于当前区间,如果它的最大值和最小值不是分居区间的两个端点的话,那么我们显然可以把两端多出去的部分舍掉,因为,在区间最大值最小值 ...

随机推荐

  1. Salesforce 版本控制 - VS Code + GitHub + Salesforce

    使用VS Code开发Salesforce有个很好的地方是可以联接GitHub进行代码版本控制,点击查看使用VS Code开发SalesForce 第一步:安装GIthub Desktop Githu ...

  2. Elasticsearch由浅入深(七)搜索引擎:_search含义、_multi-index搜索模式、分页搜索以及深分页性能问题、query string search语法以及_all metadata原理

    _search含义 _search查询返回结果数据含义分析 GET _search { , "timed_out": false, "_shards": { , ...

  3. JAVA8之StringJoiner

    作用:运用了StringBuilder的一个拼接字符串的封装处理 示例: StringJoiner sj = new StringJoiner("-", "[" ...

  4. Azure DevOps Server 经验分享(国内重型工程公司)

    受邀在上海为国内著名的重型工程公司的软件研发团队分享了Azure DevOps Server 的经验. http://www.cnblogs.com/danzhang/  DevOps MVP 张洪君 ...

  5. vuejs怎么和thinkphp结合

    vue在服务端部署时,我们都知道通过npm run build 指令打包好的dist文件,通过http指定是可以直接浏览的,Thinkphp通过域名指向index.php文件才可以浏览.要使前端正常调 ...

  6. pandas的使用(4)

    pandas的使用(4)--文件读取和保存

  7. gitlab 账号

    gitlab 账号 国外版-比较慢 https://gitlab.com/hgnulb 国内版-比较快 https://git.lug.ustc.edu.cn/hglibin github账号 htt ...

  8. R数据挖掘 第一篇:聚类分析(划分)

    聚类是把一个数据集划分成多个子集的过程,每一个子集称作一个簇(Cluster),聚类使得簇内的对象具有很高的相似性,但与其他簇中的对象很不相似,由聚类分析产生的簇的集合称作一个聚类.在相同的数据集上, ...

  9. C#中的Json序列化

    核心思想: 利用nuget下载“Newtonsoft.Json”包,调用其中的方法可以json化各种对象.反序列化调用“JsonConvert.DeserializeObject<DataTab ...

  10. PIE SDK 基于Dot net bar实现比例尺控件

    最近在搭建主界面的过程中,为了界面美观大方,使用了Dot net bar.但是,在Dot net bar的状态栏中放置PIE SDK自带的比例尺控件,运行主界面程序后,比例尺控件始终不显示比例尺信息, ...