华为OJ训练-合唱团

思路参考的http://blog.csdn.net/xmh1954/article/details/34422349?utm_source=tuicool&utm_medium=referral

发此文,主要是存下自己代码。

#include 

int main()
{
	using namespace std;
	unsigned int u32_StuNum = 0 ; // 存学生人数
	cin >> u32_StuNum ;
	if (u32_StuNum == 0 ) // 若学生人数为0 ,则直接退出。
	{
		return 1;
	}
	unsigned int * p_InputStuHeightData = new unsigned int[u32_StuNum]; // 存学生的身高信息。
	unsigned int * p_StuLeft  = new unsigned int[u32_StuNum]; // 存某个位置学生左侧上升升高最大人数
	unsigned int * p_StuRight = new unsigned int[u32_StuNum]; // 存某个位置学生右侧上升升高最大人数
	if ( ( p_InputStuHeightData == NULL )|| ( p_StuLeft == NULL )|| ( p_StuRight == NULL ) ) // 若内存申请失败则直接退出。
	{
		return 1;
	}
	int i = 0 ;
	for ( i = 0 ; i < u32_StuNum ; i++ ) // 存输入身高信息
	{
		cin >> p_InputStuHeightData[i] ;
	}
	for ( i = 0 ; i < u32_StuNum ; i++) // 左侧
	{
		p_StuLeft[i] = 1; // 至少一个(自己)
		for (int j = i ; j > 0 ; j-- )
		{
			if ( (p_InputStuHeightData[i] > p_InputStuHeightData[j]) && ( p_StuLeft[i]-1 < p_StuLeft[j] ) ) // 逐个向左侧遍历,如果遇到左侧比自己矮的,则比较当前自己现有最大人数是否比他大1以上
																   // 取较大值更新为自己的最大上升人数。
			{
				p_StuLeft[i] = p_StuLeft[j]+1;
			}
		}
	}
	for ( i = u32_StuNum-1 ; i >= 0 ; i--) // 右侧
	{
		p_StuRight[i] = 1; // 至少一个(自己)
		for (int j = i ; j < u32_StuNum ; j++ )
		{
			if ( (p_InputStuHeightData[i] > p_InputStuHeightData[j]) && ( p_StuRight[i]-1 < p_StuRight[j] ) ) // 逐个向右侧遍历,如果遇到右侧比自己矮的,则比较当前自己现有最大人数是否比他大1以上
				// 取较大值更新为自己的最大上升人数。
			{
				p_StuRight[i] = p_StuRight[j]+1;
			}
		}
	}
	unsigned int u32_StuOutNum = 0; 
	for ( i = 0 ; i < u32_StuNum ; i++)
	{
		cout << p_InputStuHeightData[i] << "  " << p_StuLeft[i] << "  " << p_StuRight[i] << endl ;
		u32_StuOutNum =  (p_StuRight[i]+p_StuLeft[i] > u32_StuOutNum ) ? p_StuRight[i]+p_StuLeft[i] : u32_StuOutNum;
	}
	cout << (u32_StuNum + 1 - u32_StuOutNum) << endl;
	delete [] p_InputStuHeightData ;
	delete [] p_StuLeft ;
	delete [] p_StuRight ;
	return 0;
}


你可能感兴趣的:(华为OJ训练-合唱团)