A. Dense Array(C++)

题目大意:

 如果任意两个相邻元素中的较大元素不大于较小元素的两倍,则Polycarp调用密集数组。更正式地说,对于任何i(1≤i≤N−1) ,必须满足此条件:

 例如,数组[1,2,3,4,3]、[1,1,1]和[5,10]是密集的。而且[5,11],[1,4,2],[6,6,1]的阵列不是稠密的。
您将得到一个由n个整数组成的数组。要使数组密集,您需要向数组中添加的最小数目是多少?可以在数组中的任意位置插入数字。如果阵列已经密集,则无需添加数字。
例如,如果a=[4,2,10,1],那么答案是5,在数组中插入元素后,数组本身可能是这样的:a=[4,2,3,5,10,6,4,2,1](构建这样的数组还有其他方法)。

输入:

第一行包含一个整数t(1≤T≤1000). 然后,t测试用例随之出现。
每个测试用例的第一行包含一个整数n(2≤N≤50)数组a的长度。
下一行包含n个整数a1,a2,…,an(1≤ai≤50)。
输出:

对于每个测试用例,输出一个整数-必须添加到数组中以使其密集的最小数。

输入样例如上图所示。

解题思路:

为了节省时间,可以边输入边判断。因为第一个没谁可以判断所以先将数组第一个输入。

从第二个开始判断它与前一个的关系,先将从第二个开始的每一个赋给一个变量x,根据上面那个公式,判断他们俩是不是密集。

如果是,直接赋给数组相应位置;

如果不是,在判断两者的大小关系:

如果x>a[i-1],那么插入两数之间的值要大于a[i-1],且要满足公式(为了方便运算,直接让相邻两数的比值等于2,即直接判断2*a[i-1]与x的关系),直到插入数的个数实现密集(用一个变量记录),再把x赋给数组相应位置;

如果x<a[i-1],那么插入两数之间的值要大于x,且要满足公式(判断2*x与a[i-1]的关系),之后同上。之后的数一都是这样。

参考代码:

#include<iostream>
#include<algorithm>
using namespace std;
int a[55];
int main()
{
	int N;
	cin >> N;//实例个数
	while(N--)
	{
		int num,i,x,count = 0;//count做记录
		cin >> num;
		cin >> a[0];//数组第一个不需要判断
		for (i = 1; i <= num-1; i++)//从数组第二个开始
		{
			cin >> x;
			if (max(x,a[i-1])<=2*min(x,a[i-1])) a[i] = x;//满足公式
			else
			{
				int b;
				if(x>a[i-1])
				{
					b = a[i - 1];
					while(2*b<x)
					{
						count++;
						b *= 2;
					}
				}
				else
				{
					b = x;
					while(2*b<a[i-1])
					{
						count++;
						b *= 2;
					}
				}
				a[i] = x;
			}
		}
		cout << count << endl;
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值