VJ 1385 盗窃-月之眼
背景
怪盗基德 VS OIBH
第三话
描述
怪盗基德第三次来到熟悉的OIBH总部。屡屡失败的OIBH这次看守的是The Eye of Moon。还是那个
房间,还是那扇门,不同的是OIBH对密码锁进行了改进。这次屏幕上只显示一个数n(基德:这是
改进了还是退化了?)。
密码生成方法:设集合A中A={1,2,...,n},B为A子集。对于B中任意一个元素x,2x均不在集合B中。
B中元素数目最大值即为密码。
格式
输入格式
一行,一个整数n(1<=n<=maxlongint)
输出格式
只有一个整数m,表示B中元素最大值
样例1
样例输入1
100
样例输出1
67
限制
OIBH在6s内就会发现,所以每个点只有1s时间给你
题解:首先对于n的后一半一定不在集合A中,所以后一半可以直接选取。之后对于另一半的后一半, 会被其前一半乘2给覆盖掉,于是只去其前一半,然后递归找下去。
CODE:
#include <iostream> #include <cstdio> #include <cstring> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) using namespace std; int main(){ long long n, ans = 0; cin >> n; while(n > 0){ ans += (n + 1) / 2; n /= 2; n /= 2; } cout << ans << endl; return 0; }