bnuoj 1065 简单的问题(位运算)
简单的问题
时间复杂度是评估一个算法的重要参考标准。
比如常见的冒泡排序和选择排序,时间复杂度是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
每组数据的第一行有一个正整数 n (1≤n≤10000)。
接下来同一行有n个非负整数,每个数都不超过 2^16范围。两个数之间用空格分开。
Output
Sample Input
1 2 18467 6334
Sample Output
70239
这是一道涉及位运算的题目。按位或运算规则:1 | 1 = 1, 1 | 0 = 1,0 | 1 = 1, 0 | 0 = 0。
//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 简单的问题(位运算)相关推荐
- 【codevs2343】简单题【位运算】【卡常大法好】
这道题的题意十分浅显易懂. 有一串很长很长不知道有多长(最长十万)的01序列,一开始全是0. 要你维护两种操作:将一个区间内的数翻转(就是1变0,0变1,就是异或1).询问某一位是0还是1. 树状数组 ...
- c语言位运算负数的实例_一招教你学会C语言中位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...
- Java位运算之2的N次幂、整数转换、寻找只出现一次的数
Java位运算 位运算:只能对整数进行位运算,可加快计算机计算速度.因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快,比如乘法.除2操作:通过左右移二进制位即可,无需将数转为十进 ...
- android位运算简单讲解
一.前言 在查看源码中,经常会看到很多这样的符号"&"."|"."-",咋一看挺高大上:仔细一看,有点懵:再看看,其实就是大学学过的 ...
- python写整数逆位运算_简单了解python的一些位运算技巧
前言 位运算的性能大家想必是清楚的,效率绝对高.相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算.但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂.不过,在面试的过程中 ...
- NKU两题简单题解析(递归分析与位运算技巧)
题目:http://acm.nankai.edu.cn/p1002.html 题意:对给定的f(n),当 n>=50025002 的时候,f(n)=n-5:当 n<50025002 的时候 ...
- 超简单的位运算---再也不用担心看不懂题解了
超简单的位运算---再也不用担心看不懂题解了 写在前面 1.原码.反码与补码------整形在计算机中的储存 2.移位操作符 3.位操作符 4.小练手 写在最后 写在前面 大家好,这里是风扇的小小笔记 ...
- Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串
Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串 具体代码如下: package package2;import java.util.Scanner;/*** 加密可以这 ...
- UVALive 3351 Easy and Not Easy Sudoku Puzzles 位运算~判断简单数独
题意:给定一个9*9的数独,要求判断是否为简单数独. 数独:对于每一行每一列或者子方格内,只能填1~9这几个数,并且每个数字只能出现一次,比如说: 如果一个9*9的数独是简单数独的话,这个数独的解是独 ...
最新文章
- hashmap hashtable 的区别
- .NET 面试题总结 (附有参考答案) 第1部分
- (2) 第二章 WCF服务与数据契约 服务契约详解(二)- 如何引用WCF提供的服务
- vue ...mapMutations 的第一个参数默认为 数据对象state
- oracle 同步 部份表,Oracle 同步表数据外键处理
- zynqNet整体思路框架
- Delphi XE7中新并行库
- 当你女朋友向你索吻的时候。。
- mysql 不在另一张表_mysql查询在一张表不在另外一张表的记录
- potplayer播放器的下载与截图配置
- Win7和win10下python3和python2同时安装并解决pip共存问题
- Romantic 扩展欧几里得
- java enable_Java Compiler enable()方法与示例
- [SCM]源码管理 - perforce的trigger和daemon
- 【GDB调试学习笔记】利用core文件调试程序
- 针对吞吐量优化的架构
- ArcGIS发布地图服务--ArcMap
- WannaCry勒索病毒分析
- MTCNN人脸检测与人脸对齐
- 《mysql必知必会》学习笔记