バインドBOJ 1744個の数字


https://www.acmicpc.net/problem/1744
2秒、128 MBメモリ
input :
  • N(1 <= N <= 10,000)
  • 数量(-1000<=数量<=10000)
  • output :
    最大コンビネーション
  • の出力は
  • である.
    条件:
  • 数列の2つの数を合わせたいです.
  • 位置に関係なく、
  • をバンドル可能
  • {0,1,2,4,3,5}の場合,この数列の和を直接0+1+2+4+3+5=15とする.ただし、2と3を結合し、4と5を結合すると、0+1+(23)+(45)=27
  • となる
    位置合わせ角度が強そうに見えますが...
    やっぱり条件が多ければ多いほど間違いやすい...
    どうせ負数に乗じていることを知っておくと...2つのリストを並べばいいのに、ハハハハ......きょうどう
    まずは2つのハイライトを見逃しました
    1.プラス1は大きいです.△ほかに1万まで数えたほうがいいですよ.後でやりましょう.
    2.0負数に乗算すると、最大数になります.(負数リストに0を追加)
    負数のリストは昇順に並べられ、乗算時に最大となる.
    最小の負数に正数を乗じると、値が大きくなります.0は一番小さいやつと乗らなければならない.
    最後に.正数と負数を乗算する場合は,文中のi+1がリスト外にあるかどうか例外処理を行う必要がある.
    import sys
    
    n = int(sys.stdin.readline())
    positive = []
    negative = []
    one = 0
    for i in range(n):
        data = int(sys.stdin.readline())
        if data > 1:
            positive.append(data)
        elif data <= 0:
            negative.append(data)
        else:
            one += 1
    
    positive.sort(reverse=True)
    negative.sort()
    
    ans = 0
    for i in range(0, len(positive), 2):
        if i + 1 < len(positive):
            ans += positive[i] * positive[i + 1]
        else:
            ans += positive[i]
    for i in range(0, len(negative), 2):
        if i + 1 < len(negative):
            ans += negative[i] * negative[i + 1]
        else:
            ans += negative[i]
    
    
    print(ans + one)