小L的序列
链接:https://ac.nowcoder.com/acm/contest/696/B
来源:牛客网
题目描述
如果一个数x满足的|x|二进制中1的个数>0的个数我们认为他是一个好的数。
一个好的数的价值是1,而一个不好的数的价值是-1
比如|2|=|−2|=2(10)=10(2),|10|=|−10|=10(10)=1010(2)|2|=|−2|=2(10)=10(2),|10|=|−10|=10(10)=1010(2)
小L想知道一个序列AnAn的价值是多少
输入描述:
第一行有一个整数n,表示序列AnAn的长度
第二行有n个整数,第i个整数AiAi表示序列中第i个数是多少
输出描述:
输出仅一行,表示这个序列的价值是多少
示例1
输入
复制
2
2 1
输出
复制
0
说明
1(1),2(-1)
示例2
输入
复制
6
1 2 3 4 5 6
输出
复制
2
说明
1(1),2(-1),3(1),4(-1),5(1),6(1)
备注:
对于50%50%的数据: n=1,−105≤Ai≤105n=1,−105≤Ai≤105
对于100%100%的数据: 1≤n≤105,−231−1≤Ai≤231−11≤n≤105,−231−1≤Ai≤231−1
题解:
题目的意思是判断数的绝对值的二进制数中1与0个数,如果1的个数大于0的个数,则这个数的价值就是1,否则为-1,最后计算整个序列中的总价值;(博主表达能力有限,看不懂的话请看代码)(注意数据取值范围)
源代码:
#include <stdio.h>
const int N=100001;
int two(long long x)
{
int t1=0,t2=0,i,t=0;//t1记录1的个数,t2记录0的个数
char tt[10000];//用来存放x的二进制数
while(x>0)//将x化为2进制数储存在tt中
{
tt[t]=x%2+'0';
x/=2;
t++;
}
tt[t]='\0';
for(i=0;i<t;i++)//记录1,0的个数
if(tt[i]=='1')
t1++;
else
t2++;
if(t1>t2) return 1;
return -1;
}
int main()
{
long long a[N];
int n,sum=0,i;//sum记录总价值
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
for(i=0;i<n;i++)
if(a[i]>0)
sum+=two(a[i]);
else
sum+=two(-a[i]);
printf("%d\n",sum);
return 0;
}