博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 10730 - Antiarithmetic?
阅读量:4074 次
发布时间:2019-05-25

本文共 877 字,大约阅读时间需要 2 分钟。

题目大意:

给n个数组成的序列,他们是0~n-1, 问序列中是否有按顺序的3个数,是等差数列。

思路:

用一个数组记录每个数在序列中的位置,然后枚举3个数中最小的一个,再枚举等差数列的增量,最后看着三个数的位置是不是连续的即可。

n最大为1W,但这个算法的复杂度看起来好像是O(n^2),怎么速度还挺快的呢?粗略的分析一下复杂度吧。

第一层for循环是0...n,重点是看第二层for循环 :  for(int j=1;  i+2*j < n; ++j)

把 i+2*j < n 移项改变一下成了:

j < n/(2*i),j就是第二层for循环的枚举次数,我们可以发现,随着i的增大,j会变得越来越小,而且变化速度很快。

当i=1,2,3...n时, j 分别要枚举:   n/2,  n/4, n/6, n/8, n/10, n/12,   ...n/(2*i)次,我们可以发现当i=5时,j 枚举的次数为n/10已经小于n的10倍了,当i=20时j 的次数为n/40, 小于n的40倍了。假设n等于1W,那么当i=5时,j 要枚举1000次, 当i=20时,只要枚举250次,第二层的降速是非常快的。所以这个算法的复杂度是远远小于O(n^2), 目测在n log n左右

代码:

#include
#include
#include
#include
#include
using namespace std;const int MAXN = 10010;int n;int arr[MAXN];inline bool judge(int* a){ for(int i=0; i
a[i+j]&&a[i+j]>a[i+2*j] ) return false; } } return true; } int main(){ int x; while(~scanf("%d:", &n) && n){ for(int i=0; i

转载地址:http://hszni.baihongyu.com/

你可能感兴趣的文章
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>
ssh 如何方便的切换到其他节点??
查看>>
JSP中文乱码总结
查看>>
Java-IO-File类
查看>>
Java-IO-java的IO流
查看>>
Java-IO-输入/输出流体系
查看>>
Java实现DES加密解密
查看>>
HTML基础
查看>>
Java IO
查看>>
Java NIO
查看>>
Java大数据:Hbase分布式存储入门
查看>>
大数据学习:Spark RDD操作入门
查看>>
大数据框架:Spark 生态实时流计算
查看>>
大数据入门:Hive和Hbase区别对比
查看>>
大数据入门:ZooKeeper工作原理
查看>>
大数据入门:Zookeeper结构体系
查看>>
大数据入门:Spark RDD基础概念
查看>>
大数据入门:SparkCore开发调优原则
查看>>
大数据入门:Java和Scala编程对比
查看>>