题目地址
给定n个数,初始有n个1,每次选择一个数,替换为所有数的和,可以无限次操作,问能否得到给定的数组。
- 显然,一次操作后的序列中肯定有一个最大值就是上一个序列的总和,反过来想,每一个序列的最大值就是上一个序列的总和。即Max_now=Sum_pre=Max_pre+其他数,因为其他数不会变,所以最大值在上一个序列中的值Max_pre就是Max_now-其他数总和。
- 用个堆维护最大值,然后从最后的target数组逆推,不断更新当前的max和sum。
- 考虑[1,1e9]的情况,所以不能一个序列一个序列的更新,直接除一下再减去。
- 特判n==1的情况。
code
class Solution {
public:
bool isPossible(vector<int>& target) {
int n=target.size();
if(n==1){
return target[0]==1;
}
long long sum=0;
priority_queue<int> q;
for(int i=0;i<n;i++){
q.push(target[i]);
sum+=target[i];
if(target[i]<1){
return false;
}
}
while(true){
int mx=q.top();
q.pop();
if(mx<=(sum-mx)){
return false;
}
int ts=mx/(sum-mx);
if(mx%(sum-mx)==0){
ts--;
}
// cout << ts << "
";
int tmp=mx-ts*(sum-mx);
q.push(tmp);
sum-=(mx-tmp);
// cout << tmp <<" " << sum <<"
";
if(sum==n){
return true;
}
}
return false;
}
};