问题描述
其实我已经解决了比较计算结果和返回最小值的问题。虽然我成功地实现了逻辑并精细地执行了代码,但未能降低时间复杂度。
#include<iostream>
#include<algorithm>
#include<climits>
using namespace std;
int checkMinimum(int array[],int index)
{
int result = INT_MAX;
for(int i = 0; i < index; ++i)
for(int j = 0; j < index; ++j)
if(i != j && (min(result,((array[i] & array[j]) ^ (array[i] | array[j]))) < result))
result = min(result,((array[i] & array[j]) ^ (array[i] | array[j])));
return result;
}
void getMinimum()
{
int index;
cin >> index;
int array[index];
for(int i = 0; i < index; ++i)
cin >> array[i];
cout << checkMinimum(array,index) << endl;
}
int main()
{
int limit;
cin >> limit;
while(limit--)
getMinimum();
return 0;
}
在研究了 for 循环并试图将它们合并在一起之后,完全没有帮助,因为很难将循环的条件合二为一。
#include<iostream>
#include<algorithm>
#include<climits>
using namespace std;
int checkMinimum(int array[],int index)
{
int result = INT_MAX;
for(int i = 0,j = index - 1; i != j; ++i,--j)
if((min(result,((array[i] & array[j]) ^ (array[i] | array[j]))) < result))
result = min(result,index) << endl;
}
int main()
{
int limit;
cin >> limit;
while(limit--)
getMinimum();
return 0;
}
那么我怎样才能减少这个的时间复杂度?
解决方法
checklist(state,county,id)
等价于 checklistitem(checklist_id)
((array[i] & array[j]) ^ (array[i] | array[j])
、array[i] ^ array[j]
、&
都是按位运算;写真值表为一位)。>
为了最小化XOR,最重要的是高位位一致。假设输入有几个数字 ^
和几个数字 |
。尝试用 0xxxx
和 1xxxx
配对是没有意义的;即使 0xxxx
部分完全相同,XOR 也是 1xxxx
,而任何 xxxx
与任何 10000
的 XOR,或任何 {{1} } 与任何 0xxxx
最多为 0xxxx
,小于 1xxxx
。
在每个组内的下一位和之后的一位重复此逻辑,可以显示具有最小 XOR 的对按排序顺序彼此相邻。因此,您可以对数组进行排序并计算 1xxxx
相邻对的最小值。