码迷,mamicode.com
首页 > 编程语言 > 详细

Leetcode1354_多次求和构造目标数组

时间:2020-03-01 19:56:34      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:无限   top   struct   tps   有一个   数组   vector   amp   维护   

题目地址

给定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 << "\n";
            int tmp=mx-ts*(sum-mx);
            q.push(tmp);
            sum-=(mx-tmp);
            // cout << tmp <<" " << sum <<"\n";
            if(sum==n){
                return true;
            }
        }
        return false;
    }
};

Leetcode1354_多次求和构造目标数组

标签:无限   top   struct   tps   有一个   数组   vector   amp   维护   

原文地址:https://www.cnblogs.com/zxcoder/p/12391411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!