Условие:
Перестановкой назовем массив, состоящий из n различных целых чисел от 0 до n − 1 в произвольном порядке. Например, [ 2 , 1 , 0 , 4 , 3 ] является перестановкой, а [ 0 , 1 , 1 ] и [ 0 , 2 ] — нет. На день рождения Пете подарили перестановку p 1 , p 2 , … , p n . Счастье Пети определяется как количество пар ( i , j ) , таких что 1 ≤ i p j . Пете разрешено многократно выполнять следующую операцию: переместить первый элемент перестановки в ее конец. Например, если изначально у Пети была перестановка [ 1 , 2 , 0 , 4 , 3 ] , то после применения операции у него будет перестановка [ 2 , 0 , 4 , 3 , 1 ] . Для каждого k от 0 до n − 1 выведите значение счастья Пети, если он выполнит данную операцию k раз. Формат входных данных Первая строка содержит число n ( 2 ≤ n ≤ 3 ⋅ 10 5 ) — размер перестановки. Вторая строка содержит записанные через пробел числа p 1 , p 2 , … , p n — перестановку чисел от 0 до n − 1 . Формат выходных данных В следующих n строках выведите числа a 0 , a 1 , … , a n − 1 , где a k — счастье Пети при условии, что он k раз переместил первый элемент перестановки в ее конец.
Мой код (c++):
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector <int> v;
for (int i = 0; i < n; ++i){
int a;
cin >> a;
v.push_back(a);
}
for (int i = 0; i < n; ++i){
v.push_back(v[i]);
}
for (int k = 0; k < n; ++k){
int c = 0;
for (int i = 0; i < n; ++i){
for (int j = i + 1; j < n; ++j){
if (v[i + k] > v[j + k]){
c++;
}
}
}
cout << c << endl;
}
return 0;
}
Код проходит все тесты, кроме последнего. В последнем сказано, что превышено максимальное время. Как можно это поправить?
C/C++
Превышено максимальное время работы в коде с++
- Считаем счастье исходной перестановки a[0] - можно и так, как у тебя сделано.
- Счастье всех следующих перестановок считается рекуррентной формулой:
a[k] = a[k - 1] + n - 1 - 2 * v[k - 1];
Что-то вроде такого: int n;
cin >> n;
vector v(n);
for (auto &e: v) { cin >> e; }
int c = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
c += v[i] > v[j];
}
}
for (auto e: v) {
cout
Юрий Цыпушкин
данное решение выполняется слишком долго, думаю решение должно быть менее чем O(n^2).
Ну, у меня запустилось. Прогнал через отладчик, всё работает
#include
#include
using namespace std;
int main() {
int n;
cin >> n;
vector p(n);
for (int i = 0; i < n; ++i) {
cin >> p[i];
}
vector a(n);
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (p[i] > p[j]) {
a[0]++;
}
}
}
for (int k = 1; k < n; ++k) {
a[k] = a[k - 1];
if (p[k - 1] > p[n - 1]) {
a[k]--;
} else {
a[k]++;
}
for (int i = k; i < n - 1; ++i) {
if (p[i] > p[k - 1]) {
a[k]--;
} else {
a[k]++;
}
}
}
for (int k = 0; k < n; ++k) {
cout
ты видимо проходишь отбор, какие задачи ты решил, го обмен
Похожие вопросы
- Как уменьшить время работы программы? C++
- Задача на максимальное произведение в векторе C++ Где ошибка в коде?
- Код работает некорректно. Язык Си. Нахождение максимального отрицательного элемента матрицы и замена его числом.
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++, динамическое программирование)?
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++)?
- Объясните как работает этот участок кода, я что то не много запутался с механикой работы.
- Работа с файлами С++, ну кто-нибудь помогите мне разработать код без ошибок, чтобы работало
- Заменить нулями элементы массива, которые расположены между первым минимальным и последним максимальным элементами масси
- Напишите пожалуйста код на 5 вариант очень простой я на 1 курсе вуза и нужен простой код.
- Найти максимальный элементы в строке матрицы