[bzoj 1011] [HNOI2008]遥远的行星:近似算法(一种正确性显然的非乱搞的科学做法)

本文主要是介绍[bzoj 1011] [HNOI2008]遥远的行星:近似算法(一种正确性显然的非乱搞的科学做法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:给N个数Mi(1≤N≤10^5, 0≤Mi≤10^7)和实数a(0.01<a≤0.35),对每个1≤i≤N求 aij=1MiMjij ,相对误差不超过5%即可。

这种形式的和式不太好处理,也许用到某种奇妙的求和顺序、递推关系、或者数据结构?扫了一眼题解,黄学长的代码很短同时表示“这种题到底是什么鬼”,有题解标题为“根据所允许的误差进行模糊DP”。看来“误差不超过5%”的条件并不像我所以为的那样只是由于浮点误差……对于浮点误差而言,允许5%的相对误差似乎有点大?Too young, too simple, sometimes native……

于是又想了想。初中初识放缩法,对1/100+1/101+…+1/120这样的和式进行分组,组中的数用组内最大或最小的数替代,得出范围。组分多了难算,分少了范围太松,常常需要进一步调整。本题能不能运用这种思想呢?1/99999和1/100000相差并不大。

既然允许5%的误差是关键,那就来算一算。可以把答案调小,也可以调大,这里就调大好了。

y>x ,则 1y<1x ,为了用 1x 代替 1y ,须满足 1x(1+5%)1yy1.05x

配合上前缀和,一段一段往前跳就好了。会跳多少次呢?y=1.05x,迭代一下,指数增长,所以分的段数是对数级别。这是一个时间复杂度 O(nlgn) 的算法。牺牲了一点时间,但显然可以保证相对误差不超过5%。常数会不会很大呢? log1.05105236 ,总运算量在千万级别,可接受。

有一些其他做法,比如前2000个暴力算,后面的把分母统统当作i-ai/2,的确可以AC,但是……总感觉不太科学?

【UER #7】天路 一道和相对误差有关的好题。

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX_N = 1e5;
const double r = 1.05;
double M[MAX_N+1], S[MAX_N+1];int main()
{int N;double a;scanf("%d %lf", &N, &a);for (int i = 1; i <= N; ++i)scanf("%lf", &M[i]);for (int i = 1; i <= N; ++i)S[i] = S[i-1] + M[i];for (int i = 1, j, k, p, q; i <= N; ++i) {double ans = 0;j = floor(i*a);while (j) {p = i-j;q = std::min((int)std::max(ceil(p*r), double(p+1)), i);k = i-q;ans += (S[j]-S[k])/p;j = k;}printf("%f\n", ans*M[i]);}return 0;
}

新年第一题。加油。

这篇关于[bzoj 1011] [HNOI2008]遥远的行星:近似算法(一种正确性显然的非乱搞的科学做法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

一种快速生成CSV的方法

事情是这个样子的 在QQ群在聊把如何100万数据导出成CSV文件?会不会很慢? 俺回了一句“现在的机器性能好,没啥问题”。 然后大家开始谈论机器的配置了。哎,俺的机器配置有点差。 然后俺就进行了一个测试。 测试数据 数据定义         public struct Rec         {             public int v1;             publi

GraphPad Prism 10 for Mac/Win:高效统计分析与精美绘图的科学利器

GraphPad Prism 10 是一款专为科研工作者设计的强大统计分析与绘图软件,无论是Mac还是Windows用户,都能享受到其带来的便捷与高效。该软件广泛应用于生物医学研究、实验设计和数据分析领域,以其直观的操作界面、丰富的统计方法和多样化的图表样式,成为科学研究的得力助手。 数据处理与整理 GraphPad Prism 10 支持从多种数据源导入数据,如Excel、CSV文件及数据库

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 // 堆区开辟的数组空间使用 delete 释放int* p = new int[10];delete p; 正

CVPR 2024最新论文分享┆YOLO-World:一种实时开放词汇目标检测方法

论文分享简介 本推文主要介绍了CVPR 2024上的一篇论文《YOLO-World: Real-Time Open-Vocabulary Object Detection》,论文的第一作者为Tianheng Cheng和Lin Song,该论文提出了一种开放词汇目标检测的新方法,名为YOLO-World。论文通过引入视觉-语言建模和大规模预训练解决了传统YOLO检测器在固定词汇检测中的局限性。论

JWT详解:一种轻量级的身份验证和授权机制

引言 JSON Web Token(JWT)是一种基于JSON格式的开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。JWT因其轻量级、可扩展性和安全性,在Web应用程序和RESTful API中得到了广泛应用。本文将详细解析JWT的概念、结构、工作原理、应用场景以及使用时的安全注意事项。 JWT的基本概念 JWT是一种用于在用户和服务器之间传递安全

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

一种实现微观单线程,宏观上多线程的方法

1. 纵所周知的是,C语言是顺序程序设计的,那么在一些MCU中,例如STM32,Atmega168等等,在微观上程序都是单线程的,那么应该如何实现微观上的多线程呢?这个用到两个东西:一是中断,二是switch语句。听老夫为你细细道来。   2. 举个例子来说,比如我想要实现的是:MCU每2秒通过6个USART向外发送数据。一般大家首先想到的是,配置一个定时器,每2S进入一个中断函数,然后中

一种在C++中外部强行访问私有成员的方法

问题 C++在设计上,是不允许类的私有成员在外部被访问读写的。 然而,有时是想要在外部访问私有成员的。我目前常见的情况是:想要访问UE引擎代码中的类的私有成员,但又不想“污染”其源代码将其private改为public。 方法 一种方法是,再建立一个完全相同结构的类,只不过将成员改为public: class MyClassA_MirrorPublic{public:int dat

Java参数传递机制的一种打开方式

传值 or 传址?实参 or 形参?基本数据类型 or 引用数组类型?学习过Java,相信你对这些概念肯定熟悉,然,时间久了,某一天突然被问到这些,又一脸懵逼,它们讲的是啥,如何区分?来,让我们通过实践操练起来,请看下面一题,思考输出结果。 import java.util.Arrays;public class Exam4 {public static void main(String[] a