Я IT stutend, и у нас будет программный экзамен, где тестовая программа проверит нашу программу. Один из примеров частиц состоит в том, что мы получаем возраст и зарплату людей, мы должны подсчитать, сколько людей с разным возрастом
Мой код выглядит так: Struc:
struct input
{
int emp_age, emp_paid;
};
И это код, n представляет число всех людей
int diff_sum (int n, input* t)
{
int uniq_num = n;
for(int i = 0; i < n; i++)
{
for(int j = i; j < n; j++)
{
if((t[j].emp_age == t[i].emp_age) && (i!=j))
{
uniq_num = uniq_num - 1;
}
}
}
cout << uniq_num << endl;
return 0;
}
Программный тест 10 раз, а некоторые из них - это хорошо, но для некоторых тестов он сказал, что это неправильно. Я не знаю, как работает тестовый движок, и я также не знаю, какова проблема.
Одной из возможностей было бы добавить все элементы в контейнер STL с уникальными значениями:
int diff_sum (int n, input* t)
{
std::set<int> ages;
for(int i = 0; i < n; i++)
ages.insert(t[i].emp_age);
return ages.size();
}
std::set
.
Рассмотрим это: 10 10 10
. Подумайте о i
и j
указывая на элементы:
uniq_num = 3
10 10 10
i j => uniq_num = 2
10 10 10
i j => uniq_num = 1
10 10 10
i j => uniq_num = 0!!!!
Итак, мы видим, что во второй внешней итерации мы сравниваем два числа, которые мы уже знаем, одинаковы. Они уже косвенно сравниваются.
Предполагая, что вам не разрешено использовать какие-либо стандартные средства библиотеки (если да, то почему вы не так? Это было бы тривиально с помощью std::set
!), Я работал бы в противоположном порядке.
unique=0
. (Имейте в виду, что это не лучший алгоритм, и это не то, что я бы сделал для больших ресурсов, но довольно просто объяснить и реализовать с использованием самых основных концепций C++
.)
Алгоритм:
Найдите минимальный и максимальный возраст (позвоните на них min_age и max_age)
Выделите массив с max_age-min_age + 1 запись (пусть назовите его age_arr)
Задайте все записи в age_arr до 0
Для каждой структуры x задайте 1 в записи # x.emp_age-min_age
Суммируйте все значения (0s или 1s) в age_arr, удалите age_arr и верните результат
Реализация:
//Phase 1
int min_age = 1000; // Assumption!!!
int max_age = 0; // Assumption!!!
for(int i=0; i<n; i++)
{
if (min_age > t[i].emp_age)
min_age = t[i].emp_age;
if (max_age < t[i].emp_age)
max_age = t[i].emp_age;
}
//Phase 2
int age_arr_size = max_age-min_age+1;
int age_arr[] = new int[age_arr_size];
//Phase 3
for(int age=0; age<age_arr_size; age++)
age_arr[age] = 0;
//Phase 4
for(int i=0; i<n; i++)
age_arr[t[i].emp_age-min_age] = 1;
//Phase 5
int age_count = 0;
for(int age=0; age<age_arr_size; age++)
age_count += age_arr[age];
delete[] age_arr;
return age_count;
Проблема в том, что ваш код будет недооценивать количество уникальных возрастов:
например, говорят, что возраст {1,2,3,4,1,5,6,1,7}
Очевидно, здесь существует 7 уникальных возрастов, а n = 9.
В вашем коде единственное время, когда uniq_num будет уменьшено, - это когда я = 0 (когда uniq_num уменьшается на 2) и я = 4 (когда uniq_num уменьшается на другое 1).
Последний случай - двойной подсчет, поэтому ваш алгоритм дает ответ 6 вместо 7.