算法-二进制运算
C-小苯的与三角形_牛客周赛 Round 94
题目描述: 给出我们一个数x,要我们找到一个最小的y(1 <= y < x), 使得x,y,x&y这三个值可以可以构成一个三角形。
本题思路:
- 根据&运算符的性质,x & y的值一定不大于min(x,y),说明x&y是他们当中最小的一个。并且y比x小,所以问题就变为了是否可以满足:
x&y + y > x
这个式子。- 对于x&y + y这个式子,我们可以将他们看出二进制操作。对于x最高位的二进制,如果y这一位二进制位0,那么x&y和y在这一位二进制中都不会做出贡献。这样以来后面的元素也就不可能可以实现了。
- 对于x二进制最高位如果是1,那么x&y + y在这一位二进制当中就会进位,答案也一定大于x。说明此时y的最小值就是x的二进制中最高位为1,其余位为0。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){ll x; cin>>x; ll y=0;// 从最高位开始遍历,找到x的最高有效位for(ll i=31;i>=0;i--){// 检查第i位是否为1if(x>>i&1){y=1<<i; // 如果是,将y设置为2的i次方break;}}// 检查y是否满足条件:y必须大于0且小于xif(y<=0||y>=x){y=-1; // 如果不满足,将y设置为-1}cout<<y<<endl;
}
int main(){ll t;cin>>t;while(t--){ solve();}
}