Рассмотрим такой вход - 3 блока, каждый блок 2 строки, первая строка - количество элементов во втором:
5
13 20 22 43 146
4
13 22 43 146
5
13 43 67 89 146
Проблема: вычислить число целых чисел, которые присутствуют во втором линий всех трех блоков. (Для этого ввода образца выход должен быть 3 до 13, 43 и 146 присутствуют во вторых строках всех трех блоков)
Посмотрите, насколько хорошо этот код:
int main ()
{
int n, curr;
map<unsigned, unsigned char> myMap;
for (int i = 0; i < 3; ++i)
{
cin >> n;
for (int j = 0; j < n; ++j)
{
cin >> curr;
myMap[curr]++;
}
}
unsigned count = 0;
for (auto it = myMap.begin(); it != myMap.end(); ++it)
{
if (it->second == 3)
++count;
}
cout << count <<endl;
return 0;
}
Согласно стандарту operator[]
возвращается ссылка на (*((insert(make_pair(key, T()))).first)).second
. Вот почему я мог написать:
myMap[curr]++;
, и он вставил элемент с ключом curr
и инициализировал значение на ноль, если ключ не присутствовал на карте. А также он увеличил значение, несмотря на то, что элемент был на карте или нет.
Посмотрите, как просто? Это хорошо, не так ли? Это хороший пример того, что это действительно удобно.
Я думаю, что вам действительно нужно дважды проверить ваше понимание уравнения. Помните, что каждое суммирование или умножение является циклом for. Итак, используя обозначения в оригинальной статье , вы получите это:
#include <vector>
#include <cassert>
using mat = std::vector<std::vector<double>>;
double permanent(const mat& input_matrix, const mat& sign_matrix)
{
int m = input_matrix.size();
assert(m > 2);
assert(input_matrix[0].size() == m);
assert(sign_matrix.size() == m);
int cols = sign_matrix[0].size();
assert(cols == 1 << (m - 1));
double result = 0;
for (int t = 0; t < cols; ++t) {
double delta = 1;
for (int k = 0; k < m; ++k) {
delta *= sign_matrix[k][t];
}
double p = 1;
for (int j = 0; j < m; j++) {
double s = 0;
for (int i = 0; i < m; i++) {
s += sign_matrix[i][t] * input_matrix[i][j];
}
p *= s;
}
result += delta * p;
}
return result / cols;
}
int main()
{
mat A = {
{ 1, 4, 7, },
{ 2, 5, 8, },
{ 3, 6, 9, },
};
mat sign_mat = {
{ 1, 1, 1, 1, },
{ 1, -1, 1, -1, },
{ 1, 1, -1, -1, },
};
auto perA = permanent(A, sign_mat);
}