算法:uva 10730

题目大意:

给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<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;  

const int MAXN = 10010;
int n;
int arr[MAXN];  

inline bool judge(int* a){
    for(int i=0; i<n; ++i){
        for(int j=1; i+2*j<n; ++j){ //枚举增量
            if(a[i]<a[i+j]&&a[i+j]<a[i+2*j] ||
               a[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<n; ++i){
            scanf("%d", &x);
            arr[x] = i;
        }
        if(judge(arr)) puts("yes");
        else puts("no");
    }
    return 0;
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, int
, include
, 循环
, 序列
个数
10730高校代码、10730 考研院校代码、10730代码、114.215.170.39 10730、,以便于您获取更多的相关知识。

时间: 2024-09-13 06:13:15

算法:uva 10730的相关文章

uva 10730 - Antiarithmetic?

点击打开链接uva 10730 思路:枚举等差中项 分析: 1 给定一个n个数的序列判断是否有等差子序列 2 很明显我们如果要判断是否有等差子序列的话,只要去判断是否有长度为3的等差子序列 3 对于n<=10000,那么我们怎么去判断呢,由于我们要找的是是否有三个的等差序列,那么我们可以枚举每一个数作为等差中项,然后去判断 4 假设现在我们枚举num[i]作为等差中项,那么第一个数在0~i-1之间,第二个数是在i+1~n-1之间,这个时候如果单存利用for循环去找时间复杂度不能接受,那么我们想到

算法题之UVA 763

Fibinary Numbers The standard interpretation of the binary number 1010 is 8 + 2 = 10. An alternate way to view the sequence ``1010'' is to use Fibonacci numbers as bases instead of powers of two. For this problem, the terms of the Fibonacci sequence

算法题:UVa 591 Box of Bricks (模拟)

591 - Box of Bricks Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=467&page=show_problem&problem=53 2 Little Bob likes playing with his box of bricks. He puts the bricks one upon an

算法题之UVA 10891

This is a two player game. Initially there are n integer numbers in an array and players A and B get chance to take them alternatively. Each player can take one or more numbers from the left or right end of the array but cannot take from both ends at

算法题:uva 10318

题目链接: 首先,可以确定每个格子只能选一次,因为选任何大于0的偶数次,等于没有效果 一样. 然后,就可以把这题理解成从r*c的矩阵中选择一些格子进行"点亮"操作,使得最终所 有格子都是"亮"的状态.那么,每个格子要么有点亮操作,要么没有,总共复杂度为2^25,显然必须 进行减枝. 假设从第一行第一列开始,从左往右,从上往下一次依次选择,对于当前所在位置( x, y),它已经不能影响到x-2以前的行数了,所以当到x行时,如果第x-2行没有全部点亮,则进行减枝 . 此

算法题:uva 1330

题目链接: http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=4076 以前做过一道一维的,这题只是变成了二维的,其他方法都一样.HDU 1506  Largest Rectangle in a Histogram   题解 代码1: #include<cstdio> #include<cs

算法:UVa 11572

题目大意: 给n个数, n<=100W,求一个连续子序列,这个子序列中没有重复的数,问这个子序列最长是多少? 思路: 开一个数组pos,  pos[ x ] 表示x出现的位置, 这个数组初始化为-1 用一个变量start来记录当前枚举序列的起点,初始为0 然后枚举这个序列,依次记录每个数的位置, 假设当前枚举到i, 在记录这个位置之前,先检查当前这个数的位置pos[ arr[i] ]是否大于等于start,如果大于,说明这个数已经在[start, i-1]中已经出现过了,记下这个满足条件的子序列

算法:UVa 11536

题目大意: 给一个序列 X1 = 1 X2 = 2 X3 = 3 Xi = (Xi-1 + Xi-2 + Xi-3) % M + 1         for i = 4 to N 求一段最短的连续子序 列,使得这个子序列包含正整数[1,k] 思路: 扫描一遍即可,用一个队列记录下[1, k]区间内的数的位置,再用一个变量count维护[1,k]内不重复数的个数.当count等于k时说明当前 序列已经满足了要求,而队列头的数的位置就是起始位置. 算法复杂度O(n) 代码: /* * UVa 115

算法:UVa 12174

[题目大意] 你在听音乐播放器,它采用随机播放形式.随机播放的原理时先随机产生一个 1~n的排列,然后就按这个排列顺序播放歌曲.播放完这序列的所有歌曲以后,再次随机生成一个1-n的 排列,再继续播放. 现在给你一个播放历史记录,这个历史记录是不完整的,以为它是开始记录 时,已经有些歌曲播放过了而没有记录到. 现在给你一段从某个时刻开始的播放音乐的历史记录 ,以及播放器里一共有多少首歌. 问历史记录中第一首歌可能是某个随机列表中的第几首,总共 有多少种可能? [思路] 先进行预处理,用一个bool