👨‍👨‍👧‍👧[プログラマー]最適な集合


問題の説明


n個の自然数からなる繰り返し集合(複数の集合、都合のよい後に総称して「集合」と呼ぶ)では、以下の2つの条件を満たす集合を最適集合と呼ぶ.

  • 各要素の和はSの数の集合である.

  • 上記の条件を満たす各要素の積の最大の集合.
  • たとえば、2つの自然数の合計が9の4つのセットがあります.
    { 1, 8 }, { 2, 7 }, { 3, 6 }, { 4, 5 }
    各要素の最大積{4,5}が最適な集合である.
    セット内の要素の個数nとすべての要素の和sをパラメータとして指定した場合、最適なセットを返す解関数を完了します.

    せいげんじょうけん


  • 最良のセットは、昇順に並べられた1次元配列(list,vector)を返します.

  • 最適なセットが存在しない場合は、1次元配列(list,vector)に-1を入力して返します.

  • 自然数の個数nは、1以上10000以下の自然数である.

  • すべての要素の合計は、1または10または1000000以下の自然数です.
  • I/O例



    I/O例説明


    I/O例#1
    問題の例.
    I/O例#2
    2つの自然数は1つと1つの集合を構成することはできない.したがって、-1を含む配列が返されます.
    I/O例#3
    2つの自然数の集合のうち、要素の和が8の集合は以下の通りである.
    { 1, 7 }, { 2, 6 }, { 3, 5 }, { 4, 4 }
    各要素の最大積{4,4}は最適な集合である.

    プールの開始

    function solution(n, s) {
        // n이 s보다 크다면 [1,1,1] 도 만족하지 못하므로 불가능
        if(n > s) return [-1]
        // s/n 은 가장 고른 배열을 만들 수 있는 값이므로 n의 길이를 가진 배열을 s/n으로 채움
        const arr = Array(n).fill(Math.floor(s/n))
        // 나눈 후 나머지 값은 오름차 순 배열의 조건을 만족시키기 위해 배열의 뒤에서 부터 +1 하며 채워줌
        if(s%n) {
            for(let i = n-1, more = s%n ; more > 0 ; i --,more--) {
                arr[i] = arr[i]+1    
            }
        }
        return arr
    }