题目大意:
如果任意两个相邻元素中的较大元素不大于较小元素的两倍,则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;
}