资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
输入格式
第一行一个正整数n表示数组中元素的个数
第二行n个正整数表示目标状态B中的元素
输出格式
输出一行表示最少操作数
样例输入
2
7 8
样例输出
7
数据规模和约定
n<=50,B[i]<=1000
顺着想没想出来,还是看了大佬的代码,再结合自己举例,才把这题搞定,一句话,顺着想不出来,就倒着想想。感谢大佬的代码:添加链接描述
#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> q;
bool check()
{
for(int i = 0;i < q.size();i++)
{
if(q[i] != 0)
{
return true;
}
}
return false;
}
bool f() //判断奇偶
{
for(int i = 0;i < q.size();i++)
{
if(q[i]%2) //有一个是奇数,就不能同时除
{
return false;
}
}
return true;
}
int main(void)
{
cin>>n;
int t;
for(int i = 1;i <= n;i++)
{
cin>>t;
q.push_back(t);
}
int ans = 0;
while(check())//只要有一个元素不为0,就要继续进行下去
{
if(f())//如果全是偶数 ,那就相当于顺着的全部乘以2,也就是倒着的全部除以2
{
ans++;
for(int i = 0;i < q.size();i++)
{
q[i] /= 2;
}
}
else //和上面想法一样,只要有一个奇数,就不满足全部除以 2.
//所以只能找,找到一个不是偶数的,就减掉1,以此来对应顺着的加一
for(int i = 0;i < q.size();i++)
{
if(q[i]%2)
{
q[i]--;
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}