[NOIP模擬賽]樹

題目描述

已知有一棵有根樹,樹的形態未知,但是已知樹的最大深度爲D,並且深度爲i的結點有Ci個(1≤i ≤D)。求在所有可能的樹中, 直徑最長的樹的直徑是多少?


輸入格式

第1行:1個整數D,表示最大的深度

第2行:D個整數,表示Ci輸入數據保證存在至少一棵可能的樹。


輸出格式

第1行:1個整數,表示答案。


輸入樣例 
2

2 2


輸出樣例

4



題解

若樹的一種深度d的點數>1,那麼直徑至少爲d*2;

若點數=1,那就算出以其爲根的樹的直徑d1,再算出其高度與之前算出的長度之和d2,取大值。


#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+5;

int D, C[N];
int DFS( int d ) {
	int l=0;
	while( C[++d]>=2 ) l+=2;
	if( d<=D ) l=max( l+D-d+1, DFS(d) );
	return l;
}

int main() {
	scanf( "%d", &D );
	for( int i=1; i<=D; i++ ) scanf( "%d", &C[i] );
	printf( "%d\n", DFS(0) );
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章