数据结构与算法B代码编写作业,位查询,解题报告&AC代码

来源:互联网 发布:js控制div隐藏 编辑:程序博客网 时间:2024/06/06 08:24
终于回来了,继续写解题报告。

这道题唯一的难点在于如何判断第i位是不是1,这一点可以用位运算实现。对于一个2进制数(我们举个栗子,比如11100101),当我们想查询它第i位(最低位是0)的值时,可以将它右移i位,模2即可。

查询11100101的第3位,右移3位变成00011100,模2为0,即第三位数字为0。伪代码如下:

//num:待检测数字;i:查询位数cout << (num >> i % 2) << endl;

AC代码在下面,因为比较简单我就懒得写注释了= =

/*ID: Moien_PodienePROG: STRINGLANG: C++*/#include <iostream>using namespace std;int main(){    int i, j;    int N, M;    int num[100001], val, sum, check;    char op;    cin >> N >> M;    for(i = 0; i < N; i++)    {        cin >> num[i];    }    for(i = 0; i < M; i++)    {        cin >> op;        cin >> val;        if(op == 'C')        {            for(j = 0; j < N; j++)            {                num[j] += val;                num[j] %= 65536;            }        }        else if(op == 'Q')        {            sum = 0;            for(j = 0; j < N; j++)            {                check = num[j] >> val;                if(check % 2 == 1)                {                    sum++;                }            }            cout << sum << endl;        }    }    return 0;}

传说中的惯例……最后是题目……


总时间限制:    5000ms内存限制:    65536kB描述        给出N个范围在[0, 65535]的整数,编程支持以下的操作:    (1)修改操作:C d,所有的数都增加d。如果超过65535,把结果模65536。 0 <= d <= 65535    (2)查询操作:Q i,统计在N个正整数中有多少个整数其对应的二进制形式的第i位二进制位为非0。0 <= i <= 15。并且最低位i为0。      最后,输出所有查询操作的统计值。输入    输入的第一行为两个正整数N,M,其中N为操作的整数的个数,而M为具体有多少个操作。    输入的第二行为N个正整数,为进行操作的N个正整数。    下面有M行,分别表示M个操作。    N<=100000,M<=200000输出    输出所有查询操作Q的统计值,每一个查询操作统计结果输出为一行。样例输入    3 5    1 2 4    Q 1    Q 2    C 1    Q 1    Q 2样例输出    1    1    2    1提示    只输出查询操作Q的统计值。 


原创粉丝点击