Когда целые расстроились

Я застрял с этой проблемой в течение довольно длительного времени.
https://www.hackerearth.com/code-monk-bit-manipulation/algorithm/when-the-integers-got-upset/. Короче говоря, что говорит это:
Существует два массива A и P длины N. Существует третий массив Z, значения которого рассчитываются следующим образом:

Z[i]=(A[i] ^ A[i-1] ^ A[i-2]) times P[i] for i ≥ 2, and 0 otherwise.(^ is exor)

Мы должны переставить значения в A так, чтобы сумма значений в Z была минимизирована.

Eg:A[4]:2 5 4 6
P[4]:1 1 1 1

Мы можем переставить значения в A как: 5 6 2 4.
Соответствующие значения в Z будут: 0 0 1 0, а сумма будет 1.

Мой подход к этой проблеме в O (n!), Но он превышает ограничение по времени. Существует O (n ^ 2 * 2 ^ n) подход с использованием динамического программирования и битовой маскировки.

Note:N<=12.
#include <limits.h>
#include <iostream>
#include<algorithm>
using namespace std;int func(vector<int> a,vector<int> &p)
{
int res = 0;
//  for(int i=0;i<a.size();i++) cout<<a[i]<<" ";
//  cout<<endl;
for(int i=2 ; i<a.size() ; i++)
res += ((a[i-2]^a[i-1]^a[i])*p[i]);
//      cout<<res<<endl;
return res;
}

int main()
{

int t ; cin>>t ;
while(t--)
{
int n ; cin>> n;
vector<int> a(n) , p(n) ;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>p[i];

sort(a.begin() ,a.end());
int res = INT_MAX;
do{

res = min(res,func(a,p));
}while(next_permutation(a.begin() , a.end()));

cout << res << endl;
}
return 0;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …