3
2025-09-26 17:36:34
发布于:浙江
5阅读
0回复
0点赞
#include <cstdio>
using namespace std;
int i,j,n,than_2_bigger_idx; // than_2_bigger_idx: 数组里第一个>=2的元素的下标
long long *arr,ans;
signed main(void) { // 个人代码风格
scanf("%d",&n);
arr=new long long[n]; // 合法的动态定义数组长度
for(;i<n;i++)
scanf("%lld",arr+i);
for(i=0;i<n;i++) {
ans+=arr[i]/3; // 如果这种长度的边数量大于3,则做等边三角形
arr[i]%=3; // 剩下的边数
while(arr[i]--) { // 剩下的边只能用来做等腰三角形
for(j=than_2_bigger_idx;j<n;j++)
if(arr[j]>=2) { // 找到等腰三角形需要的两个腰
arr[j]-=2,ans++;
break;
}
than_2_bigger_idx=j; // 优化时间,我一开始就是因为没优化而TLE
}
}
printf("%lld",ans); // 输出
delete[] arr; // 释放内存
return 0;
}
这里空空如也
有帮助,赞一个