ZOJ 3870 数学思维

题意:给你n 个数 ,让你找出其中有多少组数字   a 异或b   大于max(a, b)

题解:首先了解异或运算的方式    相同为0  不同为1    可以知道如果要增大肯定是要不同的位多于相同的位,其次需要知道     2的n次方等于2的n-1次访加到2的1次访再加1,即最高位影响大于低位之和,也就是说只有某个数字它和其他数字最大位不相同,则异或必然大于max(a,
b);

代码:

#include<stdio.h>

#include<iostream>

#include<algorithm>

using namespace std;

int value[100005];

int main()

{

int T, mark[31], n, a[31];

scanf("%d", &T);

while(T--)

{

scanf("%d", &n);

for(int i = 1; i <= n; i++)

{

scanf("%d", &value[i]);

}

sort(value+1, value+1+n);

int sum = 0;

memset(a, 0, sizeof(a));

for(int i = 1; i <= n; i++)

{

memset(mark, 0, sizeof(mark));

int num = 0;

sum += (i-1);

while(value[i])

{

mark[num++] = value[i]%2;

value[i] /= 2;

}

int maxx;

for(int i = 0; i < num; i++)

{

if(mark[i])    sum -= a[i],  maxx = i;

}

a[maxx] ++;

}

printf("%d\n", sum);

}

}

时间: 2024-10-18 07:54:11

ZOJ 3870 数学思维的相关文章

程序设计中的数学思维函数总结(代码以C#为例)

最近以C#为例,学习了程序设计基础,其中涉及到一些数学思维,我们可以巧妙的将这些逻辑问题转换为代码,交给计算机运算. 现将经常会使用到的基础函数做一总结,供大家分享.自己备用. 1.判断一个数是否为奇数 定义:整数中,能被2整除的数是偶数,不能被2整除的数是奇数 思路点:n%2!=0则为奇数 /// <summary> /// 判断一个整数是不是奇数 /// </summary> /// <param name="n">要判断的整数</para

hdu 4710 Balls Rearrangement (数学思维)

题意:就是  把编号从0-n的小球对应放进i%a编号的盒子里,然后又买了新盒子, 现在总共有b个盒子,Bob想把球装进i%b编号的盒子里.求重置的最小花费. 每次移动的花费为y - x ,即移动前后盒子编号的差值的绝对值. 算法: 题目就是要求                  先判断  n与  lcm(a,b)的大小,每一个周期存在循环,这样把区间缩短避免重复计算. 如果n>lcm(a,b)则   ans = (n/lcm)*solve(lcm)+solve(n%lcm) 否则   ans =

Acdreamoj1115(数学思维题)

题意:1,3是完美数,如果a,b是完美数,则2+a*b+2*a+2*b,判断给出的n是否是完美数. 解法:开始只看出来2+a*b+2*a+2*b=(a+2)*(b+2)-2,没推出更多结论,囧.没办法,只能暴力将所有的完美数求出来然后查表.正解是c+2=(a+2)*(b+2);完美数都是有质因子3或5组成的(5本身除外): 自己暴力代码: /****************************************************** * author:xiefubao *****

【程序员的数学思维修炼】总结一

第一章 数据的表示 主要学习了会了 0 不是什么都没有,比如在java里BigDecimal里面是根据最高的那个精度来的,比如1.99+0.01=2.00 这时候提交可能会判错,所以要去掉后导零 为啥要用二进制 还有哪些进制,神奇的八卦,八进制.钟表使用的十二进制.半斤八两十六进制.60年一个甲子六十进制 关于二进制,最主要的是要熟练掌握位运算!一些做题中常用的技巧,比如求n的m次方,判断奇偶,统计一的个数, 这一章里还提到了20!阶乘问题,还记得怎么解决大数阶乘吗. 第二章 神奇的素数 1.验

数学思维和编程思维

1.编程没有数学基础不行 2.但懂数学不等于懂编程 举一个例子: 求1+2+3+4+……+99+100的和. 数学解法通常是: 1.(1+100)*100/2=5500 2.小学生的解法:1+2=3.3+3=6.……这样累算下去. 编程解法呢?跟数学解法2相同,代码如下: static void Main(string[] args) { int theResult = 0; for (int i = 1; i <= 100; ++i) { theResult += i; } Console.W

数学思维和逻辑能力

在无数个辗转反侧.难以入寐的夜晚,我用力地思考着一个问题:到底要不要走上编程这一条道路?想要成为一个合格的编程人员,深谙编程之道,这条路并不好走.或枯燥无味,或心力憔悴,但亦能寻到其中乐趣,发现常人难以发现的背后之美.所以,痛定思痛,决定搭上这辆于我而言的编程末班车. 接触编程,很多人第一个想法就是选择一门什么程序设计语言,我也为之苦恼了很久.找寻一圈,最后回到起点,发现了一个更加重要的东西:编程本身的思想.就此,我打一个简单的比方:学习程序设计就好比学习射击,编程语言就好比我们手里紧紧握住的枪

位运算 ZOJ 3870 Team Formation

题目传送门 1 /* 2 题意:找出符合 A^B > max (A, B) 的组数: 3 位运算:异或的性质,1^1=0, 1^0=1, 0^1=1, 0^0=0:与的性质:1^1=1, 1^0=0, 0^1=0, 0^0=0: 4 假设A < B,一定要满足B的最高位对应A的值是0,这样才可能>B(即0^1=1): 5 然后比赛时假设A的极限是类似0111111的情况,最后假设有误: 6 题解是先把每个数最高位(1)的位置统计个数,1<<4 的意思是 000010000:

不一样的数学思维导图

数学有它的特殊性,而与思维导图又能碰撞出不同的火花.思维导图制作软件让你将表达.记录.分析想法,将相关的信息连接到一起,探索更多可能性,在数学控制和归纳概念上有极大的帮助. 小编比较了这四个软件:"MindManager"."XMind"."IMindmap"和"MindMapper",在数学的应用上,小编认为"MindManager"最合适,因为数学知识有很多的关联,而且两者之间最好用箭头的方式表示最好.

数学思维修炼

最近想阅读一些数学方面的资料,但是又想和自己的工作联系上,因此就找到了这本<程序员的数学思维修炼(趣味解读)>,下面会对本书的知识点做个梳理. 1.2.6 数的阶乘 1.2.7 大整数 1.3.3 二进制运算 1.3.5 十进制和二进制之间的转换 以基数B再取余的方法 1.4 八进制.十六进制.六十进制 2.1.1 素数 2.1.3 试除法(循环到√n即可),数学家筛选法,Eratosthenes寻找100以内的素数的算法:依次去除2.3.5.7的倍数的整数 2.1.4 素数定理 2.2.2