【题解】【数组】【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 following array A:

?

 A[0] = 1 A[1] = 5 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 four peaks: elements 1, 3, 5 and 10.

You are going on a trip to a range of mountains whose relative heights are represented by array A, as shown in a figure below. You have to choose how many flags you should take with you. The goal is to set the maximum number of flags on the peaks, according to certain rules.

Flags can only be set on peaks. What‘s more, if you take K flags, then the distance between any two flags should be greater than or equal to K. The distance between indices P and Q is the absolute value |P ? Q|.

For example, given the mountain range represented by array A, above, with N = 12, if you take:

  • two flags, you can set them on peaks 1 and 5;
  • three flags, you can set them on peaks 1, 5 and 10;
  • four flags, you can set only three flags, on peaks 1, 5 and 10.

You can therefore set a maximum of three flags in this case.

Write a function:

int solution(int A[], int N);

that, given a non-empty zero-indexed array A of N integers, returns the maximum number of flags that can be set on the peaks of the array.

For example, the following array A:

?

 A[0] = 1 A[1] = 5 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..200,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);
  • 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.

思路

  1. 由于有间距要求,如果带K个flag,(K-1)*K < N ,那么K<√N
  2. 可以记录每个peak的下一个peak位置,于是时间复杂度为O(N +1+2+. . .+√N) =O(N + √N^2) =O(N)

伪代码

1 def nextPeak(A):
2   N = len(A)
3   peaks = createPeaks(A)
4   next = [0] * N
5   next[N - 1] = -1
6   for i in xrange(N - 2, -1, -1):
7       if (peaks[i]):
8           next[i] = i
9       else:
10          next[i] = next[i + 1]
11  return next

1 def flags(A):
2   N = len(A)
3   next = nextPeak(A)
4   i = 1
5   result = 0
6   while (i * i <= N):
7       pos = 0
8       num = 0
9       while (pos < N and num < i):
10          pos = next[pos]
11          if (pos == -1):
12              break
13          num += 1
14          pos += i
15      result = max(result, num)
16      i += 1
17  return result

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

时间: 2024-08-27 21:43:00

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

【题解】【数组】【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

codility flags solution

How to solve this HARD issue 1. Problem: 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

题解 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