51nod1056 最长等差数列 V2

时间:2022-04-08 23:20:21
基准时间限制:8 秒 空间限制:131072 KB 分值: 1280 
N个不同的正整数,从中选出一些数组成等差数列。
 
例如:1 3 5 6 8 9 10 12 13 14
等差子数列包括(仅包括两项的不列举)
1 3 5
1 5 9 13
3 6 9 12
3 8 13
5 9 13
6 8 10 12 14
 
其中6 8 10 12 14最长,长度为5。
 
现在给出N个数,你来从中找出一个长度 >= 200 的等差数列,如果没有,输出No Solution,如果存在多个,输出最长的那个的长度。
 
Input
第1行:N,N为正整数的数量(1000 <= N <= 50000)。
第2 - N+1行:N个正整数。(2<= A[i] <= 10^9)
(注,真实数据中N >= 1000,输入范例并不符合这个条件,只是一个输入格式的描述)
Output
找出一个长度 >= 200 的等差数列,如果没有,输出No Solution,如果存在多个,输出最长的那个的长度。
Input示例
10
1
3
5
6
8
9
10
12
13
14
Output示例
No Solution

随机化 hash 脑洞题

当N增长到5万,V1版本的双指针也怼不过去了。

然而既然题被出到OJ上,就一定有做它的方法(那可不一定.jpg)。

注意到只有ans>=200时才算有解,这说明如果有解,那么解对应的那些数分布是比较密集的(口胡)。

我们可以试着随机枚举两项,算出它们的公差,再分别向前向后找数,看能不能把等差数列续得更长。如果扫描每个数,留给随机化的时间就太少了,我们可以把数存进hash表里,这样就可以O(1)查询数是否存在,跑得飞快。

那么需要随机化多少次呢?本着不卡OJ白不卡的学术精神,我们从小到大倍增尝试。

随机1000次就能过第一个点

随机10000次能过两个点

随机100000次能过四个点

随机800000次能过八个点

随机8000000次能过一半点

随机16000000次只错三个点

随机32000000次就AC辣!

可喜可贺,可喜可贺

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct hstb{
int v,nxt;
}e[mxn];
int hd[mxn],mct=;
void insert(int x){
int u=x%mxn;
for(int i=hd[u];i;i=e[i].nxt){
if(e[i].v==x)return;
}
e[++mct].v=x;e[mct].nxt=hd[u];hd[u]=mct;
return;
}
int find(int x){
int u=x%mxn;
for(int i=hd[u];i;i=e[i].nxt){
if(e[i].v==x)return ;
}
return ;
}
int n,a[mxn],b[mxn];
int ans=;
int main(){
int i,j;
srand();
n=read();
for(i=;i<=n;i++)a[i]=read(),b[i]=a[i];;
sort(a+,a+n+);
for(int i=,cnt=;i<=n;i++){
if(a[i]==a[i-])cnt++;
else cnt=;
ans=max(ans,cnt);
}
for(i=;i<=n;i++) insert(a[i]);
random_shuffle(b+,b+n+);
int T=;
while(T--){
int x=rand()%(n-)+,y=rand()%(n-)+;
x=b[x];y=b[y];if(x>y)swap(x,y);
if(x==y)continue;
int tmp=y-x;
int res=;
for(i=y+tmp;i<=a[n];i+=tmp){
if(find(i)){
res++;
}
else break;
}
for(i=x-tmp;i>=a[];i-=tmp){
if(find(i)){
res++;
}
else break;
}
ans=max(ans,res);
}
if(ans>=)printf("%d\n",ans);
else printf("No Solution\n");
return ;
}

51nod1056 最长等差数列 V2的更多相关文章

  1. n个整数中,找出尽可能多的数使他们组成一个等差数列,求最长等差数列的长度

    例子:  3,8,4,5,6,2          返回值应该为 :5 这是昨天做的一道优酷土豆的编程题,和leetcode中的128/ Longest Consecutive Sequence 有点 ...

  2. 51nod1055 最长等差数列

    完全一脸懵逼!.dp[i][j]表示i,j为相邻的两项的最大值.两个指针两边扫的思想好劲啊这个!%%% #include<cstdio> #include<cstring> # ...

  3. 51 nod 1055 最长等差数列&lpar;dp&rpar;

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 ...

  4. 『最长等差数列 线性DP』

    最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...

  5. 【51Nod】1055 最长等差数列 动态规划

    [题目]1055 最长等差数列 [题意]给定大小为n的互不不同正整数集合,求最长等差数列的长度.\(n \leq 10000\). [算法]动态规划 两个数之间的差是非常重要的信息,设\(f_{i,j ...

  6. 51nod-1055-最长等差数列&lpar;dp&plus;优化&rpar;

    1055 最长等差数列  基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 ...

  7. 51Nod - 1055:最长等差数列 (求最长的等差数列)

    N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不列举) 1 3 5 1 5 9 13 3 6 9 12 ...

  8. 51Nod 1055 最长等差数列 &lpar;dp&plus;哈希&rpar;

    1055 最长等差数列  基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  关注 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 ...

  9. 51nod 1055:最长等差数列

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题  收藏  取消关注 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 ...

随机推荐

  1. jsp中,个别乱码进行转码操作

    来自大神 if(xh!=null && xh!=""){ xhmc =new String(xh.getBytes("ISO-8859-1"), ...

  2. mysqldump常用参数

    mysqldump常用参数说明  --all-databases 或 -A  导出全部数据库.--all-tablespaces 或 -Y 导出全部表空间--no-tablespaces  或 -y ...

  3. poj -2975 Nim

      Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4312   Accepted: 1998 Description ...

  4. sql语句用&&num;39&semi;in&&num;39&semi;执行多条语句时候&comma;执行错误的解决方法

    一般报错是出现,无法将nvarchar类型转换为int类型 这是因为 SqlParameter  带参数  是不能用  , 分割的. 第一种解决方法就是  不用 SqlParameter  带参数的s ...

  5. &lbrack;国嵌攻略&rsqb;&lbrack;097&rsqb;&lbrack;U-Boot新手入门&rsqb;

    嵌入式软件层次 1.Bootloader 2.Linux内核 3.文件系统 编译U-Boot 1.解压uboot tar zxvf uboot.tar.gz 2.清除uboot make distcl ...

  6. 分布式缓存组件Hazelcast

    Hazelcast是一个Java的开源分布式内存实现,它具有以下特性: 提供java.util.{Queue, Set, List, Map}的分布式实现 提供java.util.concurrent ...

  7. &lowbar;&lowbar;x&lowbar;&lowbar;&lpar;12&rpar;0906第三天&lowbar;&lowbar;&lt&semi;meta&gt&semi;标签

    <meta name=" " content=" " />标签常用功能: 指定浏览器对当前页面的字符集: <!doctype html> ...

  8. 【EF6学习笔记】(十一)实施继承

    上篇链接:EF学习笔记(十) 处理并发 本篇原文链接:Implementing Inheritance 面向对象的世界里,继承可以很好的重用代码.在本章就对Instructor和Student两个类进 ...

  9. 从零开始搭建VUE项目

    前言: 此样板面向大型,严肃的项目,并假定您对Webpack和vue-loader有些熟悉. 请务必阅读vue-loader的常见工作流配方的文档. 如果您只想尝试vue-loader或者鞭打一个快速 ...

  10. InnoDB,5项最佳实践,知其所以然?

    InnoDB,5项最佳实践,知其所以然? 原创: 58沈剑 架构师之路 昨天 缓存讲了一个月<缓存架构,一篇足够>.今天,开始写数据库. 第一篇,说说MySQL两个最常用的存储引擎,MyI ...