牛客OI周赛9-普及组-B题-小L的序列

小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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值