[BOJ]14241-スライムをマージ


https://www.acmicpc.net/problem/14241
質問する
英善と孝彬は水晶の泥を合わせるゲームをしている.二人は水晶泥を二つ選んで一つにしなければならない.ゲームはまだスライムが1つ残っている間に終わります.
すべての水晶泥には正数の大きさがある.2つのスライムxとyを加算すると,合成したスライムの大きさはx+yであった.また、スライムを加えるたびに、二人はx*y点を得る.
英善と孝彬が得られる点数の最値を求めるプログラムを作成してください.
入力
第1行は斜線の個数N(2≦N≦100)を与える.
2行目はスライムの大きさを示した.サイズが100以下の自然数.
しゅつりょく
1行目は英善と孝彬が得られる点数の最値を印刷した.
サンプルI/O
入力
  • 例1
  • 2
    3 4
  • 例出力1
  • 12
    入力
  • 例2
  • 3
    2 2 2
  • 例出力2
  • 12
    入力
  • 例3
  • 3
    1 2 3
  • 例出力3
  • 11
    入力
  • 例4
  • 3
    3 1 2
  • 例出力4
  • 11
    Solution
    #include <iostream>
    #include <queue>
    using namespace std;
    
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        queue<int> Q;
        int N;
        int score = 0;
        cin >> N;
        for(int i = 0; i < N; i++){
            int input;
            cin >> input;
            Q.push(input);
        }
    
        while(Q.size() > 1){
            int first = Q.front();
            Q.pop();
            int second = Q.front();
            Q.pop();
            score += first * second;
            Q.push(first + second);
        }
        cout << score << '\n';
    }
    Qの問題をうまく利用しなければならない
    上の2つを一緒に置いて、キューのデータが1つ残るまで入れ続けます.
    たまにBOJの問題レベルを見ると、実現が難しいよりも、知識が分からないと解けないほうが近いです.逆に個人的な面では実施しにくい.