牛客练习赛101-C 推理小丑---位运算+思维

牛客练习赛101-C 推理小丑---位运算+思维_第1张图片
题目要求最小值,根据贪心思想,二进制表示情况下,高位1越少越好

#include
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';
}


你可能感兴趣的:(比赛补题,c语言,算法,数据结构)