Pavel and Triangles(贪心)

链接:Pavel and Triangles

思路

问题描述:题目大意是有一连串数量的木棍,第一个数量对应的木棍长度是 2 0 2^0 20 ,第n个数目对应的长度是 2 n 2^n 2n ,用这些木棍尽可能多地组成三角形。

分析:对于两个相邻长度的木棍 l i l_i li l i + 1 l_{i+1} li+1 ,两个长度为 l i l_i li必然无法和 l i + 1 l_{i+1} li+1 组成三角形,因为 l i l_i li*2= l i + 1 l_{i+1} li+1。更进一步,对于 l i l_i li必然无法和之后长度的木棍组成一般三角形(三边不等)或等腰三角形。

可知,任意不同的三边无法组成三角形,对于该题所给木棍长度,仅能组成等边三角形和等腰三角形。

对于长度为 l i l_i li的木棍只有三种组成三角形的方式,(1)取三份与自身组成等边三角形
(2)取两份与前面所剩木棍组成等腰三角形
(3)取一份与后面的木棍组成等腰三角形

贪心策略:只需要用一个rest变量标记当前长度之前的所剩木棍个数,依次与当前长度数量的木棍组成等腰三角形,再用剩下的当前长度的木棍组成等边三角形,所剩的木棍再加入rest变量

注意

必须先尽可能的组成等腰三角形,再组成等边三角形。

我们的贪心策略为,尽可能多的用掉木棍,使剩下的rest尽可能的小(用的越多,组成的三角形越多)。对于第i种木棍,假设当前最长的木棍为 l i l_i li,而rest中的木棍仅能作为组成等腰三角形的第三条边,统称小于 l i l_i li l m l_m lm l m l_m lm仅能作为组成等腰三角形的第三边, l i l_i li能组成等边三角形,能作为组成等腰三角形的腰,所以 l i l_i li适用范围更广,且作为等边的时候相当于替代了等腰中第三边的 l m l_m lm,所以尽可能多的先用掉 l m l_m lm,能够组成更多的三角形。且对于后续长度的 l i + 1 l_{i+1} li+1来说,rest中木棍长度为 l m l_m lm l i l_i li都不影响。所以应该先组等腰用掉rest,再组等边用掉剩余的 l i l_i li

代码

#include<iostream>
using namespace std;
int main()
{
	long long n,ans=0,rest=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		long long k,t;//t表示当前长度所能组成的三角形个数 
		cin>>k;
		//等腰 
		t=min(k/2,rest);//剩余木棍能组成的个数和当前长度所能组成的个数 取较小者
		rest-=t;//每个三角形仅有一边从前面剩下的木棍中取 
		ans+=t;
		
		//等边 
		k-=t*2;//当前长度所剩个数 
		ans+=k/3;
		k%=3;
		rest+=k;
	}
	cout<<ans; 
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值