题意:举例:给你一个数组[9,3,5],问你这个数组是否可以由数组[1,1,1]经过某种变换得到。
变换的步骤就是每次用数组的和,去替代数组中的某一个元素,直到达到目标数组。
题解:我们从后往前递推,比如[9,3,5],那么它的上一个状态一定是[1,3,5] ,继续[1,3,1] --> [1,1,1] 最后能够到达[1,1,1]的就true。
但是数组里的元素的数据范围是10^9 ,一步一步推是肯定超时的,我们可以从中寻找到规律,一次可以递推好几步,只要最大的数字经过一次递推之后还是最大的数字,假设经过n次递推,最大的数字才不是最大的,那么这n次递推可以一步得到,具体的公式可以自己研究下。
typedef long long int _int;
class Solution {
public:
priority_queue<_int> q;
bool isPossible(vector<int>& target) {
int len = target.size();
_int sum = 0;
for(int i=0;i<len;i++)
{
q.push((_int)target[i]);
sum +=(_int) target[i];
}
while(1)
{
_int term = (_int)q.top();//第一小
q.pop();
if(term==sum&&term!=1)
return false;
_int term2 = (_int) q.top();//第二小
if(term==1)
break;
if(term==term2)
return false;
_int y = sum-term;
_int res;
if((term-term2)%y==0)
res = term2;
else
res = term - ((term-term2)/y+1)*y;
if(res<=0)
return false;
q.push(res);
sum = res + y;
}
return true;
}
};