【UOJ 测试】B. 【#245 UER #7】天路(近似算法+RMQ)

2023-10-04 22:40
文章标签 测试 uoj uer 近似算法 245 rmq

本文主要是介绍【UOJ 测试】B. 【#245 UER #7】天路(近似算法+RMQ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

245. 【UER #7】天路
  隆冬将至,几天后跳蚤国便会迎来寒冬,这对于以血肉之躯和飞机搏斗的跳蚤们来说并不是件好事……然而在悠悠历史岁月中,跳蚤国早已有了应对严寒的应急措施方案!
  在跳蚤国王的带领下,跳蚤们准备启动天路热能塔 —— 红米 note7(红米 note7 为发烧而生)。这座热能塔高耸入云,直接穿出大气层从太空中直接吸收太阳光,垂直向下将热能送往跳蚤国各个角落。热能塔的制造工艺巧夺天工,被誉为“带来温暖的天路”。
  但是跳晚们为了让跳蚤们都因为天气寒冷赖在被子里不肯起床,在热能塔启动后一定会歇斯底里地进攻。跳蚤国高级间谍的情报显示,跳晚国计划将发射 n台三星 note7 向热能塔发起进攻。进攻将会按一定顺序进行,其中第 ii 次进攻的高度为 ai(1≤i≤n)。
  为了防止热能塔被炸毁,跳蚤国王特地派尛焱轟(一种新型交通工具,运载能力是小火车的三次幂)运送来了跳蚤们刚研制出不久的新型材料 —— Nokia1050。跳蚤们将会把 Nokia1050 装在热能塔上的某一连续的高度区间上以抵挡进攻。
  现在,跳蚤国王想在热能塔受损程度和材料消耗量之间进行取舍。所以对于每个 2≤k≤n,跳蚤国王想知道整个攻击过程中如果想让 Nokia1050 在某一时段至少挡住连续 k次攻击,那么安装 Nokia1050 的高度区间的长度至少是多少。其中,若高度区间为 [l,r],则长度为 r−l。
  事实上,间谍的消息也不见得会多么靠谱,所以跳蚤国王仅想知道一个不那么准确的答案。具体来说:如果对于每个 k你输出的答案 ck与标准答案 c^k 的相对误差均不超过 5%,则算作正确。即:∣ck−c^k∣≤5%⋅c^k
输入格式
 第一行一个正整数 n,保证 n≥2。
 第二行 n个正整数 a1,…,an,按顺序给出每次进攻时三星 note7 的高度。
输出格式
 输出 n−1行,其中第 k−1行表示至少抵挡连续 k次攻击时所需的最短高度区间长度。(2≤k≤n)
 因为十分重要所以说两遍,如果对于每个 kk 你输出的答案 ck与标准答案 c^k的相对误差均不超过 5%,则算作正确。即:∣ck−c^k∣≤5%⋅c^k
样例一
 input
  4
   1 7 5 2
  output
   2
   5
   6
  explanation
   当 k=2时,最优高度区间为 [5,7];
   当 k=3时,最优高度区间为 [2,7];
   当 k=4 时,最优高度区间为 [1,7];
   注意 k=2时不能选择高度区间 [1,2],虽然能够拦截下第 1次和第 4次攻击,但这两次攻击并不连续。
样例二
  input
   10
   26 723 970 13 422 968 875 329 234 983
  output
   93
   546
   639
   734
   749
   957
   957
   957
   970
  explanation
   样例输出给出的为准确答案,注意下面的输出也是可接受的:
     93
     540
     630
     730
     740
     960 
     960
     960
     970

【题解】【近似算法+RMQ】

【算法一】【线段树或RMQ维护区间最大最小值,暴力求解。期望得分:50分】

【正解来袭!】

【这是一个求解近似值的题,从前貌似没做过。。。】

【其实,我们可以从求准确值开始考虑:那么,即上面50分的做法,枚举长度暴力求解。但我们会发现:近似的是答案而不是区间长度,这样做根本没法近似。所以,我们考虑枚举结果,每次查找当前结果所能满足的最长距离即可。这样我们就可以近似了:枚举时答案的跨越长度是1.05(至于为什么是1.05,我表示我也不清楚。。。hxy说应该是根据允许5%的误差范围选的,好像很有道理!)。】

【查找每次的距离时,我们可以用两个指针t1、t2,如果当前区间[t1,t2]的答案还小于当前的答案,那么,我们将t2后移,否则将t1后移。在判断区间[t1,t2]的答案时,我们用RMQ来查询。】

【RMQ预处理每个区间的最大值和最小值,可以做到O(1)查询】

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int maxn[100010][20],minn[100010][20],mi[100010];
int ans[100010],n,a[100010];
inline void pre()
{for(int j=1;j<20;++j)for(int i=1;i<=n;++i)if(i+(1<<(j-1))<=n){maxn[i][j]=max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]);minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]);}for(int i=1;i<=n;++i){int k=0;while((1<<k)<=i) ++k;mi[i]=k-1;}
}
inline int get_cha(int l,int r)
{int ans1=0,ans2=0,k=mi[r-l+1];ans1=max(maxn[l][k],maxn[r-(1<<k)+1][k]);ans2=min(minn[l][k],minn[r-(1<<k)+1][k]);return (ans1-ans2);
}
inline int find(int x)
{int t1=1,t2=1,len=0;while(t1<=n&&t2<=n){int sum=get_cha(t1,t2);if(sum<=x) {len=max(len,t2-t1+1);if(t2<n) t2++;else t1++;}elseif(t1<n) t1++;else t2++;}return len;
}
int main()
{int i,j;scanf("%d",&n);for(i=1;i<=n;++i)scanf("%d",&a[i]),maxn[i][0]=minn[i][0]=a[i];pre();memset(ans,127,sizeof(ans));int m=get_cha(1,n),len=find(0);ans[len]=0;for(double i=1;i<=m*1.05;i*=1.05){int x=floor(i);int sum=find(x);ans[sum]=min(ans[sum],x);}for(i=n-1;i>1;--i) ans[i]=min(ans[i],ans[i+1]);for(i=2;i<=n;++i) printf("%d\n",ans[i]);return 0;} 

[附UOJ题解]



[反正我没大看懂。。。]


这篇关于【UOJ 测试】B. 【#245 UER #7】天路(近似算法+RMQ)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2881

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

BIRT 报表的自动化测试

来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-birttest/如何为 BIRT 报表编写自动化测试用例 BIRT 是一项很受欢迎的报表制作工具,但目前对其的测试还是以人工测试为主。本文介绍了如何对 BIRT 报表进行自动化测试,以及在实际项目中的一些测试实践,从而提高了测试的效率和准确性 -------

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前后端吗? 有必要。本文从三个方面论述。分别是可测试,可维护,可移植。 可测试 软件黑盒测试更普遍,但很难覆盖所有应用场景。于是有了接口测试、模块化测试以及单元测试。都是通过降低测试对象

day45-测试平台搭建之前端vue学习-基础4

目录 一、生命周期         1.1.概念         1.2.常用的生命周期钩子         1.3.关于销毁Vue实例         1.4.原理​编辑         1.5.代码 二、非单文件组件         2.1.组件         2.2.使用组件的三大步骤         2.3.注意点         2.4.关于VueComponen

如何成为一个优秀的测试工程师

链接地址:http://blog.csdn.net/KerryZhu/article/details/5250504 我一直在想,如何将自己的测试团队打造成世界一流的团队?流程、测试自动化、创新、扁平式管理、国际标准制定、测试社区贡献、…… 但首先一点是明确的,就是要将每一个测试工程师打造成优秀的测试工程师,优秀的团队必须由优秀的成员构成。所以,先讨论“如何成为一个优秀的测试工程师”,