简单的问题

Time Limit: 1000ms
Case Time Limit: 1000ms
Memory Limit: 65536KB
算法的渐进时间复杂度是算法的运行时间的一种度量方式,通常用运行时间随输入规模的增长而增长的速率来表示。 
时间复杂度是评估一个算法的重要参考标准。 
比如常见的冒泡排序和选择排序,时间复杂度是O(n^2),而快速排序、归并排序的时间复杂度是O(nlogn)。这两类算法在实现的时候,其运行时间随着数据规模的增长而增长的速率不同。一般来说到n=10000的规模的时候两类算法的运行时间就会有显著差异。 
下面有一个程序:
-----------------------------------------------
#include<stdio.h>
int main()
{
   int n,a[10001];
   int T;
   int i,j,k;
   int ans=0;
   scanf("%d",&T);
   while(T--)
   {
       scanf("%d",&n);
       ans=0;
       for(i=0;i<n;++i)
           scanf("%d",&a[i]);
       for(i=0;i<n;++i)
           for(j=0;j<n;++j)
               ans+=(a[i]|a[j]);
       printf("%d\n",ans);
   }
return 0;
}
-----------------------------------------------
上面这个程序的时间复杂度就是O(n^2)的,输入规模增长到原来的n倍,运行时间将会是原来的n^2倍(两重循环内部的操作的次数变为原来的n^2倍)。这样的程序对于n高达10000的数据规模运行时间显然太长了,无法达到我们的要求。所以请你帮忙修改一下这个程序(只是两重循环的部分),降低算法的时间复杂度,但是程序的功能不能改变。

Input

测试数据有多组,第一行给出了测试数据的组数T(T<100)
每组数据的第一行有一个正整数 n (1≤n≤10000)。 
接下来同一行有n个非负整数,每个数都不超过 2^16范围。两个数之间用空格分开。

Output

输出有T行,每行为一个非负整数,为每组输入数据的对应输出,结果不会超出32位整数的范围。

Sample Input

1
2 18467 6334

Sample Output

70239

这是一道涉及位运算的题目。按位或运算规则:1 | 1 = 1, 1 | 0 = 1,0 | 1 = 1, 0 | 0 = 0。

所以可以记录每个数的二进制表示每一位上的数是0还是1,当是1时,和其他数运算时这一位上的结果就是1.具体请参考代码。
//s[i]记录有多少个数的第i位上的数字是1
//flag[i][j]表示第i个数的第j位上的数字是0还是1
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 1e4 + 5;
int a[N], s[20], flag[N][20];
int Pow(int x)
{if(x == 0)return 1;int ans = 1;for(int i = 1; i <= x; i++)ans *= 2;return ans;
}
int main()
{int t, n, i, j;scanf("%d",&t);while(t--){memset(s, 0, sizeof(s));memset(flag, 0, sizeof(flag));scanf("%d",&n);int ans = 0;for(i = 0; i < n; i++){scanf("%d",&a[i]);int k = a[i];for(j = 0; j <= 16; j++){int r = k % 2;if(r == 1){s[j]++;flag[i][j] = 1;}k /= 2;}}for(i = 0; i < n; i++){for(j = 0; j <= 16; j++){if(flag[i][j] == 1)ans += n * Pow(j);elseans += s[j] * Pow(j);}}printf("%d\n",ans);}return 0;
}

bnuoj 1065 简单的问题(位运算)相关推荐

  1. 【codevs2343】简单题【位运算】【卡常大法好】

    这道题的题意十分浅显易懂. 有一串很长很长不知道有多长(最长十万)的01序列,一开始全是0. 要你维护两种操作:将一个区间内的数翻转(就是1变0,0变1,就是异或1).询问某一位是0还是1. 树状数组 ...

  2. c语言位运算负数的实例_一招教你学会C语言中位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...

  3. Java位运算之2的N次幂、整数转换、寻找只出现一次的数

    Java位运算 位运算:只能对整数进行位运算,可加快计算机计算速度.因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快,比如乘法.除2操作:通过左右移二进制位即可,无需将数转为十进 ...

  4. android位运算简单讲解

    一.前言 在查看源码中,经常会看到很多这样的符号"&"."|"."-",咋一看挺高大上:仔细一看,有点懵:再看看,其实就是大学学过的 ...

  5. python写整数逆位运算_简单了解python的一些位运算技巧

    前言 位运算的性能大家想必是清楚的,效率绝对高.相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算.但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂.不过,在面试的过程中 ...

  6. NKU两题简单题解析(递归分析与位运算技巧)

    题目:http://acm.nankai.edu.cn/p1002.html 题意:对给定的f(n),当 n>=50025002 的时候,f(n)=n-5:当 n<50025002 的时候 ...

  7. 超简单的位运算---再也不用担心看不懂题解了

    超简单的位运算---再也不用担心看不懂题解了 写在前面 1.原码.反码与补码------整形在计算机中的储存 2.移位操作符 3.位操作符 4.小练手 写在最后 写在前面 大家好,这里是风扇的小小笔记 ...

  8. Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串

    Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串 具体代码如下: package package2;import java.util.Scanner;/*** 加密可以这 ...

  9. UVALive 3351 Easy and Not Easy Sudoku Puzzles 位运算~判断简单数独

    题意:给定一个9*9的数独,要求判断是否为简单数独. 数独:对于每一行每一列或者子方格内,只能填1~9这几个数,并且每个数字只能出现一次,比如说: 如果一个9*9的数独是简单数独的话,这个数独的解是独 ...

最新文章

  1. hashmap hashtable 的区别
  2. .NET 面试题总结 (附有参考答案) 第1部分
  3. (2) 第二章 WCF服务与数据契约 服务契约详解(二)- 如何引用WCF提供的服务
  4. vue ...mapMutations 的第一个参数默认为 数据对象state
  5. oracle 同步 部份表,Oracle 同步表数据外键处理
  6. zynqNet整体思路框架
  7. Delphi XE7中新并行库
  8. 当你女朋友向你索吻的时候。。
  9. mysql 不在另一张表_mysql查询在一张表不在另外一张表的记录
  10. potplayer播放器的下载与截图配置
  11. Win7和win10下python3和python2同时安装并解决pip共存问题
  12. Romantic 扩展欧几里得
  13. java enable_Java Compiler enable()方法与示例
  14. [SCM]源码管理 - perforce的trigger和daemon
  15. 【GDB调试学习笔记】利用core文件调试程序
  16. 针对吞吐量优化的架构
  17. ArcGIS发布地图服务--ArcMap
  18. WannaCry勒索病毒分析
  19. MTCNN人脸检测与人脸对齐
  20. 《mysql必知必会》学习笔记

热门文章

  1. 译文| 相信指标还是相信经验?
  2. Spring注入方法
  3. 2019年第十二届全国大学生信息安全实践创新赛线上赛Writeup
  4. git fetch 命令
  5. 不是你无法入门自然语言处理(NLP),而是你没找到正确的打开方式
  6. [转载]HTTP协议详解
  7. Linux-rmdir命令
  8. 时间序列数据库的秘密(3)——加载和分布式计算
  9. visual studio xcopy /exclude测试
  10. 浏览器的内核及版本的判断