题目大意:有n个整数,每次操作可以把一个数字任意的分成2份,要求对于数组中的任意两个数字x和y,2x>y,问需要的最少的操作次数
1<=n<=100;1<=a[i]<=1e7
思路:因为我们只能使数字减小而不能增大,所以我们可以直接考察n个数中最小的数的2倍是否大于其他数,而要想分的次数最少,那么我们就要令每份都等于最小值的2倍-1,所以我们遍历每个数,这个数除以2x-1向上取整再-1就是要进行的操作数
#include<iostream>
#include<cstdio>
const int N = 105;
int a[N];
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int mi = 0x7fffffff;
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
mi = min(mi, a[i]);//求数组的最小值
}
int x = 2 * mi - 1;
int ans = 0;
for (int i = 1; i <= n; i++)
{
ans += a[i] / x;
if (a[i] % x == 0)
ans--;//不用ceil向上取整的话可以特判整除时答案-1
}
printf("%d\n", ans);
}
return 0;
}