题目要求最小值,根据贪心思想,二进制表示情况下,高位1越少越好
#include<iostream>
using namespace std;
const int N = 100010;
int a[N];
int res=0;
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int j=30,i;j>=0;j--)//遍历每一位,假设这一位为0,如果不满足条件这一位必须选,为1
{
int t=res;
//看第j位为0的情况下是否满足条件
for(int k=j-1;k>=0;k--)
{
t|=1<<k;
//不满足break,这里必须是>号
for(i=1;i<n;i++)if((a[i]&t)>(a[i+1]&t))break;
//不满足证明这一位不能为1,异或一下变为原值
if(i!=n)t^=1<<k;
}
//判断是否满足,不满足证明第j位必须为1
for(i=1;i<n;i++)if((a[i]&t)>=(a[i+1]&t))break;
if(i!=n)res|=1<<j;
}
cout<<res<<'\n';
}