#c
#c
Вопрос:
Я создаю код для решения проблемы в Исландии.Kattis.Com называется voff, в котором вы должны рассчитать количество собак, необходимое для создания определенной частоты лая.
Существует N лаев, и каждая собака может лаять до одного раза каждые K секунд. Первая строка ввода содержит N и K, вторая строка содержит время, в которое был слышен лай.
Я создал код на Python, который почти достаточно быстр, чтобы получить 100 баллов, но немного стесняется этого. Поэтому я решил написать тот же код, но на C (clang 7.0.0-3 ~ ubuntu0.18.04.1), и когда я запускаю любой другой тестовый пример, кроме первого, я получаю превышение лимита памяти.
Я пытался использовать ‘long long’, ‘unsigned long long’ и ‘int’, но у меня превышен лимит памяти для всех из них.
#include <bits/stdc .h>
using namespace std;
int main() {
int N, K;
vector<int> barks;
vector<int> dogs;
dogs.push_back(0);
cin >> N >> K;
for(int i = 0; i < N; i ){
int inp;
cin >> inp;
barks.push_back(inp);
}
for(int bark : barks){
for(int i = 0; i < dogs.size(); i ){
if (bark >= dogs[i]){
dogs[i] = bark K;
break;
} else {
dogs.push_back(bark K);
}
}
}
cout << dogs.size() << endl;
}
При вводе первого тестового примера вывод является и должен быть ‘1’.
Но при запуске любого другого тестового примера он превышает лимит памяти.
Комментарии:
1. Для каких входных данных вы превышаете лимит памяти? Каковы эти ограничения памяти?
2. Также, что должен делать этот код?
3. Вы добавляете к
dogs
вектору во время итерации по нему. Если вашif (bark >= dogs[i])
оператор всегдаfalse
(что довольно легко сделать), то вы будете добавлять к вектору dogs один раз за цикл и, следовательно, никогда не доберетесь до концаdogs
вектора.4. Я предполагаю, что ваш код на Python сделал это вместо
size_t s = dogs.size(); for(int i = 0; i < s; i ){
, и вы просто неправильно перенесли его.
Ответ №1:
В итоге вы получаете бесконечное количество собак, поскольку каждая собака, которую вы добавляете в for i
цикл, не проходит bark >= dogs[i]
тест, что приводит к добавлению другой собаки и так далее.
Изменение вашего кода, чтобы добавить только одну строку, когда ни одна строка не соответствует условию, работает:
for (int bark : barks) {
bool found = false;
for (int i = 0; i < dogs.size(); i ) {
if (bark >= dogs[i]) {
dogs[i] = bark K;
found = true;
break;
}
}
if (!found)
{
dogs.push_back(bark K);
}
}
PS не используйте #include <bits/stdc .h>
, это нестандартно и работает только на некоторых платформах, вместо этого включите только нужные вам заголовки c (например, <iostream>
и <vector>
). using namespace std
также может вызвать проблемы.
Комментарии:
1. Я использую
#include <bits/stdc .h>
, так как я писал это в соревновательном конкурсе по программированию, и у меня не так много времени, чтобы выяснить, какие компоненты мне нужны, и мне просто быстрее использовать#include <bits/stdc .h>
, если бы я написал код не в соревновательном конкурсе по программированию, который я бы использовал<iostream>
и<vector>
на месте для<bits/stdc .h>
.