CSU 2046: sequence

题目:

Description

给出一个长度为N的正整数序列a,你有两种变换操作:
1.把数列中的某个数乘 2。
2.把数列中的所有数减 1。
现在你需要通过最少的变换操作把这个数列中的数全部变成 0。

Input

第一行一个N。下面 N 行,每行一个正整数 Ai 描述这个数列。1 < =n < =200000, 1 < =ai < =109

Output

输出一行一个正整数,表示最少的变换次数。

Sample Input

2
1
2

Sample Output

3

思路:

所有操作中,减1操作的数量肯定等于数列中最大的那个数,

而乘2操作是一次操作只能针对一个数的,所以只需要把每个数的乘2操作的次数全部加起来即可。

至于每个数一共需要进行多少次乘2操作,很容易找出规律,答案就是一个数至少需要乘多少次2才能大于等于原数列中最大的那个数。

代码:

#include
#include
using namespace std;

int num[200001];

int f(int maxx,int minn)
{
	int r=0;
	while(minn2,r++;
	return r;
}

int main()
{
	int n,maxx=0,minn=1234567890;
	scanf("%d",&n);
	for(int i=0;iscanf("%d",&num[i]);
		if(maxxif(minn>num[i])minn=num[i];
	}
	int s=0;
	for(int i=0;iprintf("%d",maxx+s);
	return 0;
}

你可能感兴趣的:(CSU 2046: sequence)