Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите найти ошибку в коде

Андрей Мартаков Ученик (119), открыт 14 часов назад
Отношение
Дан массив a1,a2,...an. Необходимо выбрать в нём два элемента ai и aj, такие что i<j, и отношение ajai — максимально и больше 1.

Входные данные
В первой строке задано целое число 2 ⩽n⩽ 100 000
— количество элементов в массиве.
Во второй строке заданы n целых положительных чисел ai(1 ⩽i⩽n, 1 ⩽ai⩽ 5000).

Выходные данные
Выведите два числа — индексы элементов i и j. Если ответов несколько, то выведите любой из них.
Если ответа нет, то выведите два нуля, разделённых пробелом.

Примеры
Ввод
6
10 3 5 3 11 9
Вывод
2 5
Ввод
4
5 5 5 5
Вывод
0 0
 #include <iostream> 
#include <vector>
using namespace std;

int main()
{
int n; cin >> n;
vector <int> a(n);

for (int i = 0; i < n; i++)
cin >> a[i];

int ibest = 0;
int jbest = 1;
int imin = 0;

for (int j = 2; j < n; j++)
{
if (a[j - 1] < a[imin])
imin = j - 1;
if (a[j] / a[imin] > a[jbest] / a[ibest] && a[j] / a[imin] > 1)
{
ibest = imin;
jbest = j;
}
}

if (a[ibest] >= a[jbest])
{
cout << 0 << " " << 0;
return 0;
}


cout << ibest + 1 << " " << jbest + 1;
return 0;
}
не проходит 6 тест, неправильный ответ
3 ответа
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (273810) 14 часов назад
целочисленное деление замени на double
Андрей МартаковУченик (119) 14 часов назад
Спасибо! все тесты пройдены
Николай Веселуха Высший разум (384318) 10 часов назад
 #include <algorithm> 
#include <iostream>
#include <ranges>
#include <vector>

using namespace std;
using value_t = unsigned;
using iter_t = vector<value_t>::iterator;

double fn(const value_t max, const value_t min) {
return static_cast<double>(max) / static_cast<double>(min);
}

int main() {
size_t n;
cin >> n;
vector<value_t> nums(n);
for (auto& num : nums) {
cin >> num;
}
if (ranges::is_sorted(nums, greater<>())) {
puts("0 0");
}
else {
const auto [pmin, pmax] = ranges::minmax_element(nums);
if (pmin < pmax) {
const auto beg = nums.begin();
cout << distance(beg, pmin) + 1 << ' ' << distance(beg, pmax) + 1 << '\n';
}
else {
pair<size_t, size_t> res{};
size_t i = 0;
auto m = 0.0;
while (i < n - 1) {
for (auto j = i + 1; j < n; ++j) {
if (nums[i] < nums[j]) {
const auto t = fn(nums[j], nums[i]);
if (m < t) {
res.first = i + 1;
res.second = j + 1;
m = t;
}
}
}
++i;
}
cout << res.first << ' ' << res.second << '\n';
}
}
}
Сергей Гений (60533) 9 часов назад
для x>0 и y>0 проверка с дорогой операцией деления
 x/y > 1 
тождественна
 x > y 
Самое любопытное что мой умный компилятор не оптимизирует это даже если с помощью abs() гарантировать что оба операнда >=0. Хотя вроде математика уровня дошколы)
Похожие вопросы