https://codeforces.com/problemset/problem/1119/E
思路:
无法很好证明,只能引别人的说明:
原文链接:https://blog.csdn.net/TDD_Master/article/details/89146162
三角形的形状只有两种(2 ^ i, 2 ^ i, 2 ^ i)或者(2 ^ i, 2 ^ i, 2 ^ j)(i>j),不可能有三个边都不同的,因为是2的幂次,这样不可能构成三角形。用之前剩下的来构成三角形即采用(2 ^ i, 2 ^ i, 2 ^ j)(i>j)是更好的,对当前的i消耗少,也能得到更多的三角形,然后再去考虑(2 ^ i, 2 ^ i, 2 ^ i)的。
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=3e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
LL a[maxn];
int main(void){
cin.tie(0);std::ios::sync_with_stdio(false);
LL n;cin>>n;
for(LL i=1;i<=n;i++) cin>>a[i];
LL rest=0;
LL ans=0;
for(LL i=1;i<=n;i++){
LL temp=min(a[i]/2,rest);
ans+=temp;
a[i]-=temp*2;
rest-=temp;
ans+=a[i]/3;
rest+=a[i]%3;
}
cout<<ans<<"\n";
return 0;
}