Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Given an array of integers containing duplicate elements. The task is to find the sum of all least occurring elements in the given array. That is the sum of all such elements whose frequency is minimum in the array.
Examples:
Input : arr[] = {1, 1, 2, 2, 3, 3, 3, 3} Output : 2 The least occurring element is 1 and 2 and it's number of occurrence is 2. Therefore sum of all 1's and 2's in the array = 1+1+2+2 = 6. Input : arr[] = {10, 20, 30, 40, 40} Output : 60 Elements with least frequency are 10, 20, 30. Their sum = 10 + 20 + 30 = 60.
Approach:
- Traverse the array and use a unordered_map in C++ to store the frequency of elements of the array such that the key of map is the array element and value is its frequency in the array.
- Then, traverse the map to find the frequency of the minimum occurring element.
- Now, to find the sum traverse the map again and for all elements with minimum frequency find frequency_of_min_occurring_element*min_occurring_element and find their sum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using
namespace
std;
int
findSum(
int
arr[],
int
N)
{
unordered_map<
int
,
int
> mp;
for
(
int
i = 0; i < N; i++)
mp[arr[i]]++;
int
minFreq = INT_MAX;
for
(
auto
itr = mp.begin(); itr != mp.end(); itr++) {
if
(itr->second < minFreq) {
minFreq = itr->second;
}
}
int
sum = 0;
for
(
auto
itr = mp.begin(); itr != mp.end(); itr++) {
if
(itr->second == minFreq) {
sum += itr->first * itr->second;
}
}
return
sum;
}
int
main()
{
int
arr[] = { 10, 20, 30, 40, 40 };
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
cout << findSum(arr, N);
return
0;
}
Java
import
java.util.Collections;
import
java.util.Comparator;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.Map;
class
GFG
{
static
int
findSum(
int
arr[],
int
N)
{
Map<Integer,Integer> mp =
new
HashMap<>();
for
(
int
i =
0
; i < N; i++)
mp.put(arr[i],mp.get(arr[i])==
null
?
1
:mp.get(arr[i])+
1
);
int
minFreq = Integer.MAX_VALUE;
minFreq = Collections.min(mp.entrySet(),
Comparator.comparingInt(Map.Entry::getKey)).getValue();
int
sum =
0
;
for
(Map.Entry<Integer,Integer> entry : mp.entrySet())
{
if
(entry.getValue() == minFreq)
{
sum += entry.getKey() * entry.getValue();
}
}
return
sum;
}
public
static
void
main(String[] args)
{
int
arr[] = {
10
,
20
,
30
,
40
,
40
};
int
N = arr.length;
System.out.println( findSum(arr, N));
}
}
Python3
import
math as mt
def
findSum(arr, N):
mp
=
dict
()
for
i
in
arr:
if
i
in
mp.keys():
mp[i]
+
=
1
else
:
mp[i]
=
1
minFreq
=
10
*
*
9
for
itr
in
mp:
if
mp[itr]< minFreq:
minFreq
=
mp[itr]
Sum
=
0
for
itr
in
mp:
if
mp[itr]
=
=
minFreq:
Sum
+
=
itr
*
mp[itr]
return
Sum
arr
=
[
10
,
20
,
30
,
40
,
40
]
N
=
len
(arr)
print
(findSum(arr, N))
C#
using
System;
using
System.Collections.Generic;
class
GFG{
static
int
findSum(
int
[] arr,
int
N)
{
Dictionary<
int
,
int
> mp =
new
Dictionary<
int
,
int
>();
for
(
int
i = 0; i < N; i++)
{
if
(mp.ContainsKey(arr[i]))
{
mp[arr[i]]++;
}
else
{
mp.Add(arr[i], 1);
}
}
int
minFreq = Int32.MaxValue;
foreach
(KeyValuePair<
int
,
int
> itr
in
mp)
{
if
(itr.Value < minFreq)
{
minFreq = itr.Value;
}
}
int
sum = 0;
foreach
(KeyValuePair<
int
,
int
> itr
in
mp)
{
if
(itr.Value == minFreq)
{
sum += itr.Key * itr.Value;
}
}
return
sum;
}
static
void
Main()
{
int
[] arr = { 10, 20, 30, 40, 40 };
int
N = arr.Length;
Console.Write(findSum(arr, N));
}
}
Javascript
<script>
function
findSum(arr,N)
{
let mp =
new
Map();
for
(let i = 0 ; i < N; i++)
{
if
(mp.has(arr[i]))
{
mp.set(arr[i], mp.get(arr[i])+1);
}
else
{
mp.set(arr[i], 1);
}
}
let minFreq = Number.MAX_VALUE;
for
(let [key, value] of mp.entries())
{
if
(value < minFreq)
{
minFreq = value;
}
}
let sum = 0;
for
(let [key, value] of mp.entries())
{
if
(value == minFreq)
{
sum += key * value;
}
}
return
sum;
}
let arr=[ 10, 20, 30, 40, 40 ];
let N = arr.length;
document.write(findSum(arr, N));
</script>
Time Complexity: O(N), where N is the number of elements in the array.
Auxiliary Space: O(N) because it is using unordered_map “mp”
Last Updated :
05 Sep, 2022
Like Article
Save Article
Способ решения имеющий сложность O(N * log(N))
.
#include <stdio.h>
#include <stdlib.h>
int cmp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int main(void)
{
static int A[300000];
int N;
scanf("%d", &N);
for (int i = 0; i < N; ++i)
scanf("%d", &A[i]);
qsort(A, N, sizeof(int), cmp);
long long sum_elements = 0;
long long sum_type_a = 0;
long long sum_type_b = 0;
long long sum_type_c = 0;
for (int i = 0; i < N; ++i)
{
sum_type_a += (long long)A[i] * (N - 1 - i);
sum_type_b += (long long)A[i] * (N - 1 - i) + A[i];
sum_type_c += (long long)A[i] * (N - 1 - i) + A[i] + sum_elements;
sum_elements += A[i];
}
printf("%lldn", sum_type_a);
printf("%lldn", sum_type_b);
printf("%lldn", sum_type_c);
}
Тут выводится три суммы.
Первая сумма считается в предположении, что если мы учли пару (A[i], A[j])
, то пару (A[j], A[i])
учитывать не нужно. Также первая сумма не учитывает пары вида (A[i], A[i])
.
Вторая сумма аналогична первой, но учитывает пары вида (A[i], A[i])
.
Третья сумма аналогична второй, но учитывает обе пары (A[i], A[j])
и (A[j], A[i])
.
Не знаю, какую именно сумму вам нужно найти…
На входных данных
5
1 2 3 4 5
Будет следующий вывод:
20
35
55
A_Hatake 3 / 3 / 0 Регистрация: 30.09.2020 Сообщений: 85 |
||||
1 |
||||
Как найти сумму всех минимумов в массиве?26.11.2020, 21:36. Показов 2074. Ответов 15 Метки массив, минимум, си, сумма (Все метки)
Дан массив А, в котором содержится N целых чисел. Нужно перебрать все пары чисел A[i] и A[j] в этом массиве, для каждой пары найти минимум, и сложить вместе эти минимумы. В первой строке записано целое число N – количество элементов в массиве. Далее записаны N этих чисел массива через пробел(где 1<=N<=300000). Все числа не превышают по модулю 10^9. Добавлено через 37 минут
0 |
из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,423 Записей в блоге: 14 |
|
26.11.2020, 22:37 |
2 |
Что это у вас за индексы такие Добавлено через 1 минуту
1 |
3 / 3 / 0 Регистрация: 30.09.2020 Сообщений: 85 |
|
26.11.2020, 22:37 [ТС] |
3 |
мама Стифлера, так дело в том, что массив нам дан одномерный, но в условии даны 2 индекса. Разве это не значит, что нужно использовать оба?
0 |
из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,423 Записей в блоге: 14 |
|
26.11.2020, 22:52 |
4 |
Напишите тогда условие в оригинале. Добавлено через 2 минуты Добавлено через 6 минут
Нужно перебрать все пары чисел A[i] и A[j] в этом массиве Здесь имеется ввиду пары, а вы наверно подумали, что это второй индекс.
0 |
3 / 3 / 0 Регистрация: 30.09.2020 Сообщений: 85 |
|
26.11.2020, 22:52 [ТС] |
5 |
мама Стифлера, пожалуйста, условие в оригинале Миниатюры
0 |
Заблокирован |
|
26.11.2020, 22:58 |
6 |
Сразу дополню, в scanf ничего кроме формата переменной не пишется. В вашем случае должно быть так scanf(“%d”, &N). Никаких символов перевода строки после формата быть не должно. Не правда)
1 |
мама Стифлера из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,423 Записей в блоге: 14 |
||||
26.11.2020, 23:09 |
7 |
|||
Пишется, если нужно. Но это, конечно, не тот случай. согласен
Только в задании ввод-вывод из файлов, я вам сделал ввод-вывод на консоль.
1 |
3 / 3 / 0 Регистрация: 30.09.2020 Сообщений: 85 |
|
26.11.2020, 23:15 [ТС] |
8 |
мама Стифлера, видимо, не во всех тестах считает правильно, так как на одном из них завалился(
0 |
мама Стифлера из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,423 Записей в блоге: 14 |
||||
26.11.2020, 23:20 |
9 |
|||
A_Hatake, ну тогда я не знаю, что изменить, чтоб везде было правильно Может так: Кликните здесь для просмотра всего текста
0 |
A_Hatake 3 / 3 / 0 Регистрация: 30.09.2020 Сообщений: 85 |
||||
26.11.2020, 23:32 [ТС] |
10 |
|||
мама Стифлера, есть еще такая попытка, но она тоже на каком-то тесте валится:
0 |
из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,423 Записей в блоге: 14 |
|
26.11.2020, 23:45 |
11 |
A_Hatake, ну так может все же надо код, который с файлами работает, а не с консолью?
0 |
3 / 3 / 0 Регистрация: 30.09.2020 Сообщений: 85 |
|
26.11.2020, 23:49 [ТС] |
12 |
мама Стифлера, в этом нет разницы, это точно. Тут дело в коде
0 |
мама Стифлера из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,423 Записей в блоге: 14 |
||||
27.11.2020, 00:15 |
13 |
|||
Может все дело в в переменной S, а если так: Кликните здесь для просмотра всего текста
0 |
296 / 227 / 102 Регистрация: 11.08.2016 Сообщений: 780 |
|
27.11.2020, 15:16 |
14 |
Вообще, в задаче указана работа с файлами input.txt и output.txt
0 |
из племени тумба-юбма 2411 / 1740 / 405 Регистрация: 29.11.2015 Сообщений: 8,423 Записей в блоге: 14 |
|
27.11.2020, 15:54 |
15 |
Вообще, в задаче указана работа с файлами input.txt и output.txt ТС уже ответил, что без разницы
A_Hatake, ну так может все же надо код, который с файлами работает, а не с консолью?
мама Стифлера, в этом нет разницы, это точно. Тут дело в коде
0 |
D3m1an 296 / 227 / 102 Регистрация: 11.08.2016 Сообщений: 780 |
||||||||
27.11.2020, 18:48 |
16 |
|||||||
Сообщение было отмечено A_Hatake как решение Решениемама Стифлера, если проверяет код другая программа, то разница имеется. Результата она не найдет , ибо результирующий файл не будет создан. Вот можно попробовать. Если я нигде не ошибся
Добавлено через 4 минуты Добавлено через 2 часа 40 минут
Исправил
2 |
Данная тема основывается на теме: Массивы. Одномерные массивы. Инициализация массива
Содержание
- 1. Нахождение сумм и произведений элементов массива. Примеры
- 2. Нахождение максимального (минимального) элемента массива. Примеры
- 3. Сортировка массива методом вставки
- 4. Поиск элемента в массиве. Примеры
- Связанные темы
Поиск на других ресурсах:
1. Нахождение сумм и произведений элементов массива. Примеры
Пример 1. Задан массив A, содержащий 100 целых чисел. Найти сумму элементов этого массива. Фрагмент кода, решающего эту задачу
// сумма элементов массива A из 100 целых чисел int A[100]; int suma; // переменная, содержащая сумму int i; // дополнительная переменная // ввод массива A // ... // Вычисление суммы suma = 0; // обнулить сумму for (i=0; i<100; i++) suma += A[i];
Перебор всех элементов массива выполняется в цикле for.
Переменная sum сохраняет результирующее значение суммы элементов массива. Переменная i есть счетчиком, определяющим индекс элемента массива A[i].
Пример 2. Задан массив B, содержащий 20 вещественных чисел. Найти сумму элементов массива, которые лежат на парных позициях. Считать, что позиции 0, 2, 4 и т.д. есть парными.
// сумма элементов массива B // лежащих на парных позициях float B[20]; float sum; // переменная, содержащая сумму int i; // дополнительная переменная // ввод массива // ... // Вычисление суммы sum = 0; // обнулить сумму for (i=0; i<20; i++) if ((i%2)==0) sum += B[i];
В этом примере выражение
(i%2)==0
определяет парную позицию (парный индекс) массива B. Если нужно взять нечетные позиции, то нужно написать
(i%2)==1
Пример 3. Задан массив, который содержит 50 целых чисел. Найти сумму положительных элементов массива.
// сумма положительных элементов массива int A[50]; int sum; // переменная, содержащая сумму int i; // дополнительная переменная // ввод массива // ... // Вычисление суммы sum = 0; // обнулить сумму for (i=0; i<50; i++) if (A[i]>0) sum = sum + A[i];
Пример 4. Задан массив из 50 целых чисел. Найти произведение элементов массива, которые есть нечетными числами.
// произведение нечетных элементов массива int A[50]; int d; // переменная, содержащая произведение int i; // вспомогательная переменная // ввод массива // ... // Вычисление произведения d = 1; // начальная установка переменной d for (i=0; i<50; i++) if ((A[i]%2)==1) d = d * A[i];
Чтобы определить, есть ли элемент массива A[i] нечетным, нужно проверить условие
(A[i]%2)==1
Если условие выполняется, то элемент массива есть нечетное число.
⇑
2. Нахождение максимального (минимального) элемента массива. Примеры
Пример 1. Задан массив из 30 вещественных чисел. Найти элемент (индекс), имеющий максимальное значение в массиве.
// поиск позиции (индекса), содержащего максимальное значение float B[30]; float max; // переменная, содержащая максимум int index; // позиция элемента, содержащего максимальное значение int i; // дополнительная переменная // ввод массива // ... // поиск максимума // установить максимум как 1-й элемент массива index = 0; max = B[0]; for (i=1; i<30; i++) if (max<B[i]) { max = B[i]; // запомнить максимум index = i; // запомнить позицию максимального элемента }
В вышеприведенном примере переменная max содержит максимальное значение. Переменная index содержит позицию элемента, который имеет максимальное значение. В начале переменной max присваивается значение первого элемента массива. Затем, начиная со второго элемента, происходит прохождение всего массива в цикле for. Одновременно проверяется условие
if (max<B[i])
Если условие выполняется (найден другой максимум), тогда новое значение максимума фиксируется в переменных max и index.
Вышеприведенный пример находит только один максимум. Однако, в массивах может быть несколько максимальных значений. В этом случае для сохранения позиций (индексов) максимальных значений нужно использовать дополнительный массив как показано в следующем примере.
Пример 2. Задан массив содержащий 50 целых чисел. Найти позицию (позиции) элемента, который имеет минимальное значение. Если таких элементов несколько, сформировать дополнительный массив индексов.
// поиск позиций (индексов), содержащих минимальное значение int A[50]; int min; // переменная, содержащая минимальное значение int INDEXES[50]; // позиции элементов, содержащих минимальное значение int n; // число одинаковых минимальных значений int i; // дополнительная переменная // ввод массива // ... // 1. Поиск минимального значения // установить минимальное значение в первом элементе массива min = A[0]; for (i=1; i<50; i++) if (min>A[i]) min = A[i]; // запомнить минимальное значение // 2. Формирование массива n = 0; // обнулить счетчик в массиве INDEXES for (i=0; i<50; i++) if (min == A[i]) { n++; // увеличить число элементов в INDEXES INDEXES[n-1] = i; // запомнить позицию } listBox1->Items->Clear(); // 3. Вывод массива INDEXES в listBox1 for (i=0; i<n; i++) listBox1->Items->Add(INDEXES[i].ToString());
В вышеприведенном листинге сначала ищется минимальное значение min.
На втором шаге формируется массив INDEXES, в котором число элементов записывается в переменную n. Происходит поиск минимального значения в массиве A с одновременным формированием массива INDEXES.
На третьем шаге приведен пример, как вывести массив INDEXES в элементе управления listBox1(ListBox).
⇑
3. Сортировка массива методом вставки
Пример. Пусть дан массив A, содержащий 10 целых чисел. Отсортировать элементы массива в нисходящем порядке с помощью метода вставки.
// сортировка массива методом вставки int A[10]; int i, j; // дополнительные переменные - счетчики int t; // дополнительная переменная // ввод массива A // ... // сортировка for (i=0; i<9; i++) for (j=i; j>=0; j--) if (A[j]<A[j+1]) { // поменять местами A[j] и A[j+1] t = A[j]; A[j] = A[j+1]; A[j+1] = t; }
⇑
4. Поиск элемента в массиве. Примеры
Пример 1. Определить, находится ли число k в массиве M состоящем из 50 целых чисел.
// определение наличия заданного числа в массиве чисел int M[50]; int i; int k; // искомое значение bool f_is; // результат поиска, true - число k есть в массиве, иначе false // ввод массива M // ... // ввод числа k // ... // поиск числа в массиве f_is = false; for (i=0; i<50; i++) if (k==M[i]) { f_is = true; // число найдено break; // выход из цикла, дальнейший поиск не имеет смысла } // вывод результата if (f_is) label1->Text = "Число " + k.ToString() + " есть в массиве M."; else label1->Text = "Числа " + k.ToString() + " нет в массиве M.";
Пример 2. Найти все позиции вхождения числа k в массиве M состоящим из 50 целых чисел.
// определение всех позиций заданного числа в массиве чисел int M[50]; // массив чисел int i; // вспомогательная переменная int k; // искомое значение int INDEXES[50]; // искомый массив позиций вхождения числа k int n; // количество найденных позиций или количество элементов в массиве INDEXES // ввод массива M // ... // ввод числа k // ... // поиск числа k в массиве M и одновременное формирование массива INDEXES n = 0; for (i=0; i<50; i++) if (k==M[i]) { // число найдено n++; INDEXES[n-1] = i; } // вывод результата в listBox1 listBox1->Items->Clear(); for (i=0; i<n; i++) listBox1->Items->Add(INDEXES[i].ToString());
⇑
Связанные темы
- Массивы. Часть 1. Определение массива в C++. Одномерные массивы. Инициализация массива
- Массивы. Часть 2. Двумерные массивы. Массивы строк. Многомерные массивы
⇑
Маша Ткаченко
Ученик
(91),
на голосовании
12 лет назад
Надо задачу решить на паскале! одномерный масив”!
Голосование за лучший ответ
Адриан Сивак
Профи
(680)
12 лет назад
const n=10;
var a: array [1..n] of integer;
i,j,k,s:integer;
begin
writeln(‘ Vvedite elementi massiva’);
for i:=1 to n do
begin
write(i,’-i element’);
readln(a);
end;
for i:=1 to n do
for j:=i+1 to n do
if a>a[j] then begin
k:= a; a:= a[j]; a[j]:=k; end;
s:=a[n]+a[n-1]+ a[i-2];
writeln(‘ summa ravna’, s);
readln;
end.