トピックリンク:
パベルは、2の累乗に等しい長さを有するいくつかのスティックを有しています。
彼が持っている\(A_0の\)長さのスティック\(2 ^ 0 = 1 \) 、\(A1の\)長さのスティック\(= 2 ^ 1 \ 2)、...、\(A_ {N-1} \)の長さのスティック\(2 ^ {N-1} \) 。
パベルは、これらのスティックを使用して三角形の最大数をしたいと考えています。三角形は、各スティックは、高々1つの三角形に使用することができ、厳密に正の面積を持つ必要があります。
スティックを破るために禁止されており、各三角形は正確に3棒で構成する必要があります。
三角形の最大数を検索します。
入力
最初の行は、単一の整数含ま\を(N(1 \ルN \ル300000)\) -スティックの異なる長さの数。
2行目は含ま\(N \)整数\(LE ^ 9 10 A_0、A_1、...、A_ {N-1}(1 \ルa_iを\)を\)、aiは長さの棒の数であります等しい(2 ^ I \)を\。
出力
パベルは作ることができる非縮退三角形の最大数 - 単一の整数を出力します。
例
入力
5 1 2 2 2 2
出力
3
入力
3 1 1 1
出力
0
入力
3 3 3 3
出力
3
注意
:最初の例では、パベルは、例えば、三角形のセット(三角形の辺の長さが表示されている)することができ、\((2 ^ 0,2 ^ 4,2 ^ 4)、(2 ^ 1 2 ^ 3,2 ^ 3)、(2 ^ 1,2 ^ 2,2 ^ 2)\) 。
第2の例では、パベルは、単一の三角形を作ることができません。
:第3の例では、パベルは、例えば、三角形のセット(三角形の辺の長さが記載されている)を作成することができ、\((2 ^ 0,2 ^ 0,2 ^ 0)、(2 ^ 1 2 ^ 1,2 ^ 1)、(2 ^ 2,2 ^ 2,2 ^ 2)\) 。
解決
問題の意味
与えられた(N- \)\の番号、\(私は\)数\([I] \)の長さを表す(2 ^私は\)\を三角形の最大数を求めてスティックの数は、スペルことができます。
問題の解決策
貪欲
もともとFFTであると考えられ、欲の結果は、仕事を取得します。
二等辺三角形と正三角形:三角形の2つだけの状況を形成します。優先度の正三角形を付け、サイドは一緒にそれについての貪欲二等辺三角形の残りの部分を、こすりします。
コード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
ll n;
cin >> n;
ll ans = 0, k = 0;
for(int i = 0; i < n; ++i) {
ll a;
cin >> a;
if(k) {
ll t = min(k, a / 2);
a -= t * 2;
ans += t;
k -= t;
}
ans += a / 3;
k += a % 3;
}
cout << ans << endl;
return 0;
}