求个最大值(技巧+二分转化)
求个最大值
时间限制: 1 Sec 内存限制: 128 MB
提交: 267 解决: 52
[提交][状态][讨论版]
题目描述
一直到 n,求满足 ai >= aj 的最大的 ai % aj。
输入
输出
样例输入
2 2 3
样例输出
1
提示
题解:
排序去重之后,对1到 max{ai}中的每个数字x求出小于x的最大 ai,记为 b[x]。 对于每个 ai 枚举它的倍数即可,时间复杂度 O(max{ai} + nlogn) 。
这题比赛里已经想到思路了,就是不知道怎么去表示。。 思路很简单,设a, b , a > b -> a/b = k....r(r是余数),这样我们肯定希望a离着k*b越元越好。也就是我们枚举倍数的时候(比赛中写过枚举倍数,但是n*n的。。)我们希望b*k离着a越远越好,但是不能远过b的大小,这样就难处理了,但是可以转化成 (k+x)*b离着a越近越好,那枚举到每个数的倍数时候,对他有用的就只有一个离着这个数最近的a【i】了、、前缀处理下就好了。。记录1-maxn*2每个数比他小但是最大的a[i]就行。。
这个问题中有几个点还是比较巧妙的!!!
(1)求的是a[j]>a[i] 且a[j]%a[i]的最大值,如果把研究a[j]的话问题是不好解决的,需要转化一下,也就是上面的这个转化过程,用倍数来想
(2)开始的时候我是感觉这样会超时的,因为开始的时候如果a[i]=2,这需要(200000*2)/2=200000的,然后每个数按照这种最坏的想,也就是200000*20000,这明显是会超时的,但是之后计算之后发现最大值是134565766,也就是说复杂度是1e7,不会超时的,其实这就是个调和级数计算方式(调和级数的值:n趋近与无穷后是:1/1+1/2+1/3...+1/n~ln(n+1) +r,r是欧拉常数,r=0.5772156649.),就是高数级数里面一个简单的概念好不好,都忘了。。还有这里其实就是放缩放错了,放缩方法分两种的好不好,张宇十八讲上好像看过,趋近于无穷的是不能简单用最大的放缩的。。。
(3)想要找到最接近a[j]的某个值,第一想法肯定是二分思想比较快,但是这里又是做了一个巧妙的思想,就是用了这个辅助数组,所以查找就直接是O(1)了,相当巧妙,学习了!!!
#include <bits/stdc++.h>
using namespace std;const int maxn = 1e6 + 10;
int b[maxn], a[maxn];
int main()
{int n;while(~scanf("%d", &n)){memset(b, 0, sizeof(b));for(int i = 1; i <= n; i++)scanf("%d", &a[i]);sort(a+1, a+1+n);int index = a[1]+1;a[n+1] = maxn*2;for(int i = 2; i <= n+1; i++) ///记录比j小的最大的a[i]while(index <= a[i])b[index++] = a[i-1];int ans = 0;for(int i = 1; i <= n; i++)for(int j = a[i]*2; j <= maxn*2; j += a[i])ans = max(ans, b[j]%a[i]);printf("%d\n", ans) ;}return 0;
}
还有网上有的说二分可以,按照上面复杂度计算是不可以的,并且竞赛之后发现已经回TL了!!!
求个最大值(技巧+二分转化)相关推荐
- 遗传算法求函数最大值实验_小知识:什么是遗传算法
1 什么是遗传算法 遗传算法(GeneticAlgorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法. 其主要特点是 ...
- 用标准遗传算法求函数最大值
题:用标准遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)的最大值,其中x的取值范围为[0,10].只是一个有多个局部极值的函数 仿真过程: (1)初始化种群数目NP=50,染色体二进 ...
- Python遗传算法求一元函数最大值
Python遗传算法求一元函数最大值 前言 代码 后记 参考文献 前言 最近接触遗传算法,参考了众多例子,有些又不尽然对,所以自己边理解边修改,然后写出了下面这堆传说中的屎山... PS1:遗传算法原 ...
- 斐波那契法(Faboncci Method)求函数最大值的Python程序
斐波那契法(Fibonacci method)又称斐波那契分数法,是一种一维搜索的区间消去法(区间消去法(interval elimination method)求单变量函数无约束极值的较实用的一类直 ...
- MySQL各部门求最值_mysql 求分组最大值的十个解法
mysql 求分组最大值的十个解法 发布时间:2020-08-08 23:32:28 来源:51CTO 阅读:1383 作者:努力的C "How to solve the same prob ...
- PTA 最大和最小 (10 分)请使用指针法(间接访问)编写程序,程序的功能是从键盘输入 10 个数,求其最大值和最小值的差。
请使用指针法(间接访问)编写程序,程序的功能是从键盘输入 10 个数,求其最大值和最小值的差. 输入格式: 输入10个整数 输出格式: 无 输入样例: 1 2 3 4 5 6 7 8 9 10 输出样 ...
- 导数求函数最大值和最小值习题
前置知识:导数求函数最大值和最小值 例1 f(x)=∣x2−3x+2∣f(x)=|x^2-3x+2|f(x)=∣x2−3x+2∣,求f(x)f(x)f(x)在[−10,10][-10,10][−10, ...
- 将遗传算法(GA)应用于指定的函数 f(x) = x*sin(x)+1,x∈[0, 2л],求其最大值和最小值
一.实验项目: 遗传算法优化 二.实验目的: 理解并掌握遗传算法的基本思想.特点,能够实现基本的遗传算法,并利用遗传算法进行函数优化 三.实验内容: 1.编程实现遗传算法,并验证算法的正确性 2.设置 ...
- c语言求三个数最值非函数,C语言编程:从键盘任意输入三个数,编写求其最大值、最小值的函数,用指针作函数参数实现。...
www.shufadashi.com防采集. C语言编程:从键盘任意输入三个数,编写求其最大值.最小值的函数,用指针作函数参数实现.. #includevoid maxfunction(int*);v ...
最新文章
- 如何批量转移大量的邮件?
- Unrecognised tag: 'build'
- Pycharm远程调试之ssh remote debug(二)
- 标志寄存器EFLAGES
- Springboot starter开发之traceId请求日志链路追踪
- C++泛型算法的小总结
- Mountain Lion 10.8
- Rviz教程系列第一章之Markers
- 中文文字校对软件,找我们,字根科技
- 用英语推销计算机设备,销售电脑的英语对话
- viper12a电源电路图_viper12_viper12a工作原理详解_简单viper12a电路图
- Gamma矫正,先有鸡还是先有蛋的故事
- MySQL高级索引及调优篇
- SU2 CFD代码阅读
- 行高line-height,以及基线、顶线、中线和底线,还有内容区域、行内框和行框 by 豆豆猫的窝...
- [noip2005]篝火晚会
- [渝粤教育] 西南科技大学 财务管理与分析 在线考试复习资料(1)
- Annotation 和Spring Annotation 知识整理
- 【Linux 内核 内存管理】物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )
- 通过装疯卖傻 委曲求全