给定两个正整数N和K ( 1 ≤ K ≤ N ),任务是构造一个数组arr[] (基于 1 的索引),这样每个数组元素arr[i]要么是i要么是-i并且数组正好包含K 个正值,使得数组元素的总和为正。如果可以生成多个这样的序列,请打印其中任何一个。否则,打印“-1” 。
例子:
Input: N = 10, K = 6
Output: -1 2 -3 4 -5 6 -7 8 9 10
Explanation:
Consider the sequence as {-1, 2, -3, 4, -5, 6, -7, 8, 9, 10}, the sum of the constructed sequence is (-1) + 2 + (-3) + 4 + (-5) + 6 + (-7) + 8 + 9 + 10 = 23, which is positive.
Input: N = 7, K = 2
Output: -1
方法:给定的问题可以通过使用贪心方法解决,方法是使序列中的前(N – K) 个元素为负,其余K 个元素为正。请按照以下步骤解决问题:
- 初始化一个数组,比如arr[]来存储结果序列。
- 初始化两个变量,比如sumNeg和sumPos为0 ,分别存储第一个(N – K)和剩余元素的总和。
- 使用变量i迭代范围[0, N – K – 1]并将arr[i]的值更新为-(i + 1)并将值arr[i] 添加到变量sumNeg 。
- 使用变量i迭代范围[N – K, N – 1]并将arr[i]的值更新为(i + 1)并将值arr[i] 添加到变量sumPos 。
- 如果sumNeg的绝对值大于sumPos ,则打印-1 。否则,打印数组arr[] 中的总和元素作为结果。
下面是上述方法的实现:
C++14
// C++ program for the above approach
#include
using namespace std;
// Function to generate the resultant
// sequence of first N natural numbers
void findSequence(int n, int k)
{
// Initialize an array of size N
int arr[n];
// Stores the sum of positive and
// negative elements
int sumPos = 0, sumNeg = 0;
// Mark the first N - K elements
// as negative
for (int i = 0; i < n - k; i++) {
// Update the value of arr[i]
arr[i] = -(i + 1);
// Update the value of sumNeg
sumNeg += arr[i];
}
// Mark the remaining K elements
// as positive
for (int i = n - k; i < n; i++) {
// Update the value of arr[i]
arr[i] = i + 1;
// Update the value of sumPos
sumPos += arr[i];
}
// If the sum of the sequence
// is negative, then print -1
if (abs(sumNeg) >= sumPos) {
cout << -1;
return;
}
// Print the required sequence
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
}
// Driver Code
int main()
{
int N = 10, K = 6;
findSequence(N, K);
return 0;
}
Java
// Java program for the above approach
import java.util.Arrays;
class GFG{
// Function to generate the resultant
// sequence of first N natural numbers
static void findSequence(int n, int k)
{
// Initialize an array of size N
int[] arr = new int[n];
// Stores the sum of positive and
// negative elements
int sumPos = 0, sumNeg = 0;
// Mark the first N - K elements
// as negative
for(int i = 0; i < n - k; i++)
{
// Update the value of arr[i]
arr[i] = -(i + 1);
// Update the value of sumNeg
sumNeg += arr[i];
}
// Mark the remaining K elements
// as positive
for(int i = n - k; i < n; i++)
{
// Update the value of arr[i]
arr[i] = i + 1;
// Update the value of sumPos
sumPos += arr[i];
}
// If the sum of the sequence
// is negative, then print -1
if (Math.abs(sumNeg) >= sumPos)
{
System.out.print(-1);
return;
}
// Print the required sequence
for(int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
}
// Driver code
public static void main(String args[])
{
int N = 10, K = 6;
findSequence(N, K);
}
}
// This code is contributed by sanjoy_62
Python3
# Python program for the above approach
# Function to generate the resultant
# sequence of first N natural numbers
def findSequence(n, k):
# Initialize an array of size N
arr = [0]*n
# Stores the sum of positive and
# negative elements
sumPos = 0
sumNeg = 0
# Mark the first N - K elements
# as negative
for i in range(0, n - k):
# Update the value of arr[i]
arr[i] = -(i + 1)
# Update the value of sumNeg
sumNeg += arr[i]
# Mark the remaining K elements
# as positive
for i in range(n - k, n):
# Update the value of arr[i]
arr[i] = i + 1
# Update the value of sumPos
sumPos += arr[i]
# If the sum of the sequence
# is negative, then pr -1
if (abs(sumNeg) >= sumPos):
print(-1)
return
# Pr the required sequence
for i in range(n):
print( arr[i], end =" ")
# Driver Code
N = 10
K = 6
findSequence(N, K)
# This code is contributed by shivanisinghss2110
C#
// C# program for the above approach
using System;
class GFG
{
// Function to generate the resultant
// sequence of first N natural numbers
static void findSequence(int n, int k)
{
// Initialize an array of size N
int[] arr = new int[n];
// Stores the sum of positive and
// negative elements
int sumPos = 0, sumNeg = 0;
// Mark the first N - K elements
// as negative
for (int i = 0; i < n - k; i++) {
// Update the value of arr[i]
arr[i] = -(i + 1);
// Update the value of sumNeg
sumNeg += arr[i];
}
// Mark the remaining K elements
// as positive
for (int i = n - k; i < n; i++) {
// Update the value of arr[i]
arr[i] = i + 1;
// Update the value of sumPos
sumPos += arr[i];
}
// If the sum of the sequence
// is negative, then print -1
if (Math.Abs(sumNeg) >= sumPos) {
Console.Write(-1);
return;
}
// Print the required sequence
for (int i = 0; i < n; i++)
Console.Write(arr[i] + " ");
}
// Driver Code
public static void Main()
{
int N = 10, K = 6;
findSequence(N, K);
}
}
// This code is contributed by ukasp.
Javascript
输出:
-1 -2 -3 -4 5 6 7 8 9 10
时间复杂度: O(N)
辅助空间: O(N)