【题解】【数组】【Prime and composite numbers】【Codility】Peaks

A non-empty zero-indexed array A consisting of N integers is given.

A?peak?is an array element which is larger than its neighbors. More precisely, it is an index P such that 0 < P < N ? 1,? A[P ? 1] < A[P] and A[P] > A[P + 1].

For example, the following array A:

?

 A[0] = 1 A[1] = 2 A[2] = 3 A[3] = 4 A[4] = 3 A[5] = 4 A[6] = 1 A[7] = 2 A[8] = 3 A[9] = 4 A[10] = 6 A[11] = 2

has exactly three peaks: 3, 5, 10.

We want to divide this array into blocks containing the same number of elements. More precisely, we want to choose a number K that will yield the following blocks:

  • A[0], A[1], ..., A[K ? 1],
  • A[K], A[K + 1], ..., A[2K ? 1],
    ...
  • A[N ? K], A[N ? K + 1], ..., A[N ? 1].

What‘s more, every block should contain at least one peak. Notice that extreme elements of the blocks (for example A[K ? 1] or A[K]) can also be peaks, but only if they have both neighbors (including one in an adjacent blocks).

The goal is to find the maximum number of blocks into which the array A can be divided.

Array A can be divided into blocks as follows:

  • one block (1, 2, 3, 4, 3, 4, 1, 2, 3, 4, 6, 2). This block contains three peaks.
  • two blocks (1, 2, 3, 4, 3, 4) and (1, 2, 3, 4, 6, 2). Every block has a peak.
  • three blocks (1, 2, 3, 4), (3, 4, 1, 2), (3, 4, 6, 2). Every block has a peak. Notice in particular that the first block (1, 2, 3, 4) has a peak at A[3], because A[2] < A[3] > A[4], even though A[4] is in the adjacent block.

However, array A cannot be divided into four blocks, (1, 2, 3), (4, 3, 4), (1, 2, 3) and (4, 6, 2), because the (1, 2, 3) blocks do not contain a peak. Notice in particular that the (4, 3, 4) block contains two peaks: A[3] and A[5].

The maximum number of blocks that array A can be divided into is three.

Write a function:

int solution(vector<int> &A);

that, given a non-empty zero-indexed array A consisting of N integers, returns the maximum number of blocks into which A can be divided.

If A cannot be divided into some number of blocks, the function should return 0.

For example, given:

?

 A[0] = 1 A[1] = 2 A[2] = 3 A[3] = 4 A[4] = 3 A[5] = 4 A[6] = 1 A[7] = 2 A[8] = 3 A[9] = 4 A[10] = 6 A[11] = 2

the function should return 3, as explained above.

Assume that:

  • N is an integer within the range [1..100,000];
  • each element of array A is an integer within the range [0..1,000,000,000].

Complexity:

  • expected worst-case time complexity is O(N*log(log(N)));
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.

思路

题目大意是希望将序列等分成c片,每片都要至少有一个peak,peak就是比左右都大的数(原序列首尾不能算),求c的最大值 //Codility题目描述还真是啰嗦啊喂

  1. 用O(n)得空间统计从开始到目前为止得peak数sum[],以及最远两peak间坐标差D
  2. 求最大分片数c,即求最小分片长度k,可行解k的可能范围在(D/2,min(D,n/2)],要等分首先 n % k == 0,其次sum[k - 1], sum[2 * k - 1], sum[3 * k - 1],....sum[n - 1]这个数列有n/k项。所以外层循环k的次数等于(D/2,D]间n的约数个数(小于D/2),内层判断是否可行需要n/k的操作(小于2n/D)。于是第2步时间复杂度也是O(n)。
  3. 编程上要注意计算D的时候要考虑第一个和最后一个peak到首尾的距离,还有不要混淆K c的含义(大写字母做变量名很容易出错)。

代码

int solution(vector<int> &A) {
    int N = A.size();
    vector<int> npeaks(N+1, 0);//npeaks[i]代表第i个元素(不包括)之前peak的数量
    int maxD = 0;//最远两peak间坐标差D
    int last_peak = -1;//处理第一个peak到起始的距离
    for(int i = 1; i < N-1; i++){
        if(A[i]>A[i+1] && A[i]>A[i-1]){
            npeaks[i+1] = npeaks[i] + 1;
            maxD = max(maxD, i - last_peak);
            last_peak = i;
        }
        else{
            npeaks[i+1] = npeaks[i];
        }
    }
    maxD = max(maxD, N - last_peak);//处理最后一个peak到末端的距离
    npeaks[N] = npeaks[N-1];
    if(npeaks[N] < 1) return 0;
    if(maxD > N/2) return 1;
    for(int K = maxD/2; K <= maxD; K++){//slice长度
        if(N%K == 0){
            bool isvalid = true;
            int c = N/K;//slice数量
            for(int i = 1; i <= c; i++){
                if(npeaks[i*K] - npeaks[(i-1)*K] < 1){
                    isvalid = false;
                    break;
                }
            }
            if(isvalid) return c;
        }
    }
    cout<<"fail"<<endl;
    for(int K = maxD+1;;K++) {
        if(N%K == 0) return N/K;//不能return K 呀
    }
}

【题解】【数组】【Prime and composite numbers】【Codility】Peaks

时间: 2024-08-01 20:05:04

【题解】【数组】【Prime and composite numbers】【Codility】Peaks的相关文章

【题解】【数组】【Prime and composite numbers】【Codility】Flags

A non-empty zero-indexed array A consisting of N integers is given. A?peak?is an array element which is larger than its neighbours. More precisely, it is an index P such that 0 < P < N ? 1 and A[P ? 1] < A[P] > A[P + 1]. For example, the follo

题解 CF817C 【Really Big Numbers】

题目链接:CF817C 前置算法 : 二分 我们先考虑如何得到答案,若最小满足\(x\)减去其各数位之和后大于\(s\) \(ans = n - x + 1\) 我们只要打个表就可以发现\(:\) 若\(x < y\)则\(|x| \leq |y|\) \((\)设\(|x|\)表示\(x\)减去其各数位之和\()\) 证明就不写了 说明答案是递增的, 那就用二分 我们二分出最小满足\(|x|\)大于\(s\) \(check\)函数就根据题意所写 如果找不到\(|x| \leq s\)就输出\

POJ2739_Sum of Consecutive Prime Numbers【筛法求素数】【枚举】

Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19350 Accepted: 10619 Description Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representations d

poj 3518 Prime Gap

Prime Gap 1 #include<cmath> 2 #include<cstdio> 3 #include<algorithm> 4 #include<iostream> 5 #include<string> 6 #include<cstring> 7 #include<vector> 8 using namespace std; 9 #define max 100000 10 int prime[max+5];

sicily 1009. Mersenne Composite N

Description One of the world-wide cooperative computing tasks is the "Grand Internet Mersenne Prime Search" -- GIMPS -- striving to find ever-larger prime numbers by examining a particular category of such numbers. A Mersenne number is defined a

Summary: Prime

最近遇到很多问题都跟Prime有关,于是总结一下: Prime definition:A prime number (or a prime) is a natural number greater than 1 that has no positive divisors other than 1 and itself. A natural number greater than 1 that is not a prime number is called a composite number.

POJ1338 Ugly Numbers(解法二)

问题链接:POJ1338 Ugly Numbers.基础级练习题,用C语言编写程序. 题意简述:不能被2.3和5以外的素数整除的数称为丑数,找出第1500个丑数. 问题分析:换句话说,丑数的因子只能是2.3和5.1是丑数,对于x,若x是丑数则2x.3x和5x是丑数.利用已知的丑数,从小到不断生成丑数就可以了. 程序中,结果放在数组ans[]中,也是生产丑数的x:素数放在数组prime[]中,这个问题只有2.3和5:生成的丑数放在数组ugly[]中,然后选出最小的放入结果数组ans[]中,对于被放

sicily 1500. Prime Gap

Description The sequence of n ? 1 consecutive composite numbers (positive integers that are not prime and not equal to 1) lying between two successive prime numbers p and p + n is called a prime gap of length n. For example, 24, 25, 26, 27, 28 betwee

JavaScript数组

几乎所有编程语言原生支持数组类型.数组是最简单的一种数据结构. 创建和初始化数组.使用new关键字初始化数组,进一步可以将数组元素作为参数传递给构造器.其中使用数组的length属性,能够知道数组中存了多少个元素: var daysOfWeek = new Array();  var daysOfWeek = new Array(7);  console.log(daysOfWeek.length); var daysOfWeek = new Array('Sunday', 'Monday',