本文共 1568 字,大约阅读时间需要 5 分钟。
题目来源:
Description
“数字心灵感应”是一个非常有趣的游戏,大意是:有 N 个框,每个框里都有一些数字(同一数字可以在不同的框内出现),让玩家心里选中一个数字,并指出这个数字在哪些框内出现,就可以迅速的猜到玩家选中的数字是多少。
其实游戏的奥妙在于十进制与二进制的之间的转换,每个十进制整数转换成二进制之后,将第 1 位是 1 的所有数字放进第 1 个框,将第 2 位是 1 的所有数字放进第 2 个框,…… 根据玩家指出这个数字出现的框的编号,得到这个数字的二进制表示,从而迅速算出这个数字是多少。 所以,我们也来玩玩这个游戏,给出玩家所选中数字的所在框的个数 n 和这 n 个框对应的编号,请你计算出这个数字(框的编号从 1 到 N,对应二进制数从右往左数的位数)。Input
输入两行,第一行只有一个整数 n,第二行有 n 个整数 i1,i2,……,iN(0 < n ≤ 64, 0 < i ≤ 64,i 从小到大顺序排列)。
Output
输出一个整数,表示玩家心里所选中的数字。
Sample Input
4
1 3 4 5Sample Output
29
Note
针对样例,假设有 5 个框。
第 1 个框中的数字有:1、3、5、7、9、11、13、15、17、19、21、23、25、27、29、31; 第 2 个框中的数字有:2、3、6、7、10、11、14、15、18、19、22、23、26、27、30、31; 第 3 个框中的数字有:4、5、6、7、12、13、14、15、20、21、22、23、28、29、30、31; 第 4 个框中的数字有:8、9、10、11、12、13、14、15、24、25、26、27、28、29、30、31; 第 5 个框中的数字有:16、17、18、19、20、21、22、23、24、25、26、27、28、29、30、31; 出现玩家选中数字的框对应编号是 1、3、4、5,对应二进制表示为 11101,转换成十进制整数就是 29。再进一步解释:
1 ------00001 3 ------00011 5 ------00101 7 ------00111 … 29-----11101 31-----11111 将二进制的第一位(从右往左数)都是 1 的数放进第 1 个框。 将二进制的第二位(从右往左数)都是 1 的数放进第 2 个框。 … 反过来观察,因为 29 的二进制中,第一、三、四、五位都是 1,所以 29 就会在第 1 、3、4、5 个框中出现。明白了这个游戏怎么玩么?赶紧去和你的朋友试一试吧。
解题思路
通过二进制位,在所对应的位上加1就行了,但是需要注意i的范围是1-64所以long long 也装不下,但是最坏的情况也就是64位数全是1,那么就可以用unsigned long long 来表示。
AC代码:
#includeusing namespace std;#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#define endl '\n'typedef unsigned long long ull;int main(){ SIS; int n,x; ull ans=0; cin >> n; while(n--) { cin >> x; ans+=(ull)1<<(x-1); } cout << ans << endl; return 0;}
转载地址:http://csyof.baihongyu.com/