题意:给你一个长度为 n 的数组,下标 index 为 0~n-1,输入 n 个数字,代表 2 的 index 次方的数字的个数,求有这些数字组成的三角形的个数最大为多少。
思路:这些数字为:1 2 4 8 16 32 64... 由此可见,组成的三角形一定为等腰三角形,且长度相等的两条边要大于或等于另外一条边,对于每个数字 a[i] 尽可能地去消费比它小的数字,这样可达不浪费,也就是达到到最优。
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define show(x) cout<<x<<endl;
#define show_(x) cout<<x<<" ";
#define showEnd(x) {cout<<x<<endl; return 0;}
#define showxy(x, y) cout<<x<<" "<<y<<endl;
typedef long long ll;
typedef pair<int, int> iip;
typedef pair<ll, ll> llp;
const int MAXN = 300005;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
int i, j , n, a[MAXN];
ll ans;
int main()
{
cin>>n;
ans = 0;
for(i = 0; i < n; i++) {
cin>>a[i];
}
int pre = 0;
for(i = 0; i < n; i++) {
int cnt = min(a[i]/2, pre);
ans += cnt;
a[i] -= cnt * 2;
pre -= cnt;
ans += a[i]/3;
a[i] -= a[i]/3*3;
pre += a[i];
}
show(ans)
return 0;
}