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

Задачу по с++ как решит

fafasfadf afafafaf Ученик (248), закрыт 3 года назад
Вам дается массив из нулей и единиц. За одну операцию можно любой элемент изменить, но массив все так же должен содержать только нули и единицы. Ваша задача определить, какое наименьшее количество операций необходимо сделать, чтобы массив стал отсортированным по неубыванию.

Input Format

Вводится массив из нулей и единиц.

Constraints

Длина массива не превышает 100 000.

Output Format

Выведите одно число - ответ на задачу.

Sample Input 0

1010
Sample Output 0

2
Лучший ответ
Санек Пархомовский Мыслитель (6003) 3 года назад
Цикл сортировки делаешь. И переменную которая считает итерацию
Остальные ответы
daun Мастер (1702) 3 года назад
Про С++ нифига не знаю
Русский Перехватчик Мудрец (12550) 3 года назад
Сортировка подсчётом, почитай
Николай Веселуха Высший разум (360635) 3 года назад
#include <iostream>
#include <string>
using namespace std;
size_t fn(const string& bin) {
auto sum = 0U;
for (auto x : bin) if (x == '1') ++sum;
auto right = 0U;
auto n = bin.length();
for (auto i = sum; i < n; ++i) if (bin[i] == '1') right += 2;
return right;
}
int main() {
string bin;
cin >> bin;
cout << fn(bin) << endl;
}
Максим Суворов Ученик (172) 3 года назад
даже не знаю, я видел как zar kazik решал задачу
УМеняЕстьЧерныйКотОнПохожНаПароходУНего ХвостКакТрубаИЯркоЖелтыеГлаза Мастер (1755) 9 месяцев назад
Эта задача - классический пример задачи, которую можно решить с помощью динамического программирования. Суть задачи сводится к нахождению количества инверсий в массиве. Инверсия в контексте этой задачи - это пара чисел, в которой число 1 стоит перед числом 0.

Ваша задача состоит в том, чтобы вычислить, сколько операций потребуется, чтобы убрать все инверсии. Это можно сделать, пройдясь по массиву и подсчитывая количество единиц (что будет равно количеству потенциальных инверсий) и количество фактических инверсий. Наименьшее из этих двух чисел будет ответом на задачу.

Вот базовый алгоритм для решения этой задачи на языке C++:

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);

string s;
cin >> s;

int ones = 0, inversions = 0;

for (char c : s) {
if (c == '1') {
ones++;
} else {
inversions = min(inversions + 1, ones);
}
}

cout << inversions << "\n";

return 0;
}
```

Этот код сначала считывает ввод, а затем проходит по каждому символу в строке. Если символ '1', увеличивается счетчик единиц. Если символ '0', увеличивается счетчик инверсий, но не больше, чем количество единиц. Это потому что, вместо того чтобы "перемещать" единицу в конец массива (что является инверсией), мы можем просто "переместить" ноль в начало массива. В конце мы выводим количество инверсий, которое представляет собой минимальное количество операций, необходимых для сортировки массива.

Пожалуйста, обратите внимание, что этот код не проверяет, является ли вводимая строка действительно массивом из нулей и единиц. В реальной ситуации вам следует добавить проверки на валидность ввода.
Похожие вопросы