2019/12/07 乐山师范学院程序设计大赛—D 数字心灵感应

问题 D: 数字心灵感应

时间限制: 1 Sec  内存限制: 128 MB

题目链接:http://acm.lsnu.edu.cn/oj/problem.php?id=2490

题目描述

“数字心灵感应”是一个非常有趣的游戏,大意是:有 N 个框,每个框里都有一些数字(同一数字可以在不同的框内出现),让玩家心里选中一个数字,并指出这个数字在哪些框内出现,就可以迅速的猜到玩家选中的数字是多少。
其实游戏的奥妙在于十进制与二进制的之间的转换,每个十进制整数转换成二进制之后,将第 1 位是 1 的所有数字放进第 1 个框,将第 2 位是 1 的所有数字放进第 2 个框,……
根据玩家指出这个数字出现的框的编号,得到这个数字的二进制表示,从而迅速算出这个数字是多少。
所以,我们也来玩玩这个游戏,给出玩家所选中数字的所在框的个数 n 和这 n 个框对应的编号,请你计算出这个数字(框的编号从 1 到 N,对应二进制数从右往左数的位数)。

输入

输入两行,第一行只有一个整数 n,第二行有 n 个整数 i1,i2,……,iN(0 < n ≤ 64, 0 < i ≤ 64,i 从小到大顺序排列)。

输出

输出一个整数,表示玩家心里所选中的数字。

样例:

样例输入
4
1 3 4 5

样例输出
29

提示

针对样例,假设有 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 个框中出现。


思路:

        二进制转十进制求和。关键是数据范围,要使用unsigned long long。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    unsigned long long sum=0;//无符号64位
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%d",&x);
        sum+=(unsigned long long)1<<(x-1);
    }
    cout<<sum<<endl;//或者%llu输出
    return 0;
}

赛后题解:

# include <stdio.h>
int main() {
    int n, i, j;
    unsigned long long res = 0;
    scanf("%d", &n);
    for (j = 0; j < n;j++) {
        scanf("%d", &i);
        res |= 1ULL << (i - 1);
    }
    printf("%llu\n", res);
    return 0;
}
发布了26 篇原创文章 · 获赞 1 · 访问量 438

猜你喜欢

转载自blog.csdn.net/qq_45309822/article/details/103484736