УМеняЕстьЧерныйКотОнПохожНаПароходУНего ХвостКакТрубаИЯркоЖелтыеГлаза
Мастер
(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', увеличивается счетчик инверсий, но не больше, чем количество единиц. Это потому что, вместо того чтобы "перемещать" единицу в конец массива (что является инверсией), мы можем просто "переместить" ноль в начало массива. В конце мы выводим количество инверсий, которое представляет собой минимальное количество операций, необходимых для сортировки массива.
Пожалуйста, обратите внимание, что этот код не проверяет, является ли вводимая строка действительно массивом из нулей и единиц. В реальной ситуации вам следует добавить проверки на валидность ввода.
Input Format
Вводится массив из нулей и единиц.
Constraints
Длина массива не превышает 100 000.
Output Format
Выведите одно число - ответ на задачу.
Sample Input 0
1010
Sample Output 0
2