zoukankan      html  css  js  c++  java
  • Leetcode1354_多次求和构造目标数组

    题目地址

    给定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;
        }
    };
    
  • 相关阅读:
    BlockingQueue(阻塞队列)详解
    异步远程调用线程池队列
    JVM中的五大内存区域划分详解及快速扫盲
    http链接管理器
    influxDB 增加
    ArcGIS的sde数据库连接
    arcgis server注册文件夹
    arcmap编辑oracle数据库
    create database connection
    发布gp服务失败
  • 原文地址:https://www.cnblogs.com/zxcoder/p/12391411.html
Copyright © 2011-2022 走看看