The nearest taller cow - nazgul's Blog

The nearest taller cow

nazgul posted @ 2010年10月18日 23:43 in HNU , 1038 阅读

 

http://acm.hnu.cn/online/?action=problem&type=show&id=11449
用一个栈进行扫描,维护栈内元素的单调性
 
分别求出每个元素左边和右边的最近的更高元素,再取最大值,最后再求和取均值。
 
以求左边的为例,先从左往右扫描,遇到小于等于栈顶元素的数就将这个数入栈,继续向后扫;如果大于则弹出栈顶元素,并设置其左边最近元素为此新元素。
	#include <stdio.h>
#include <string.h>
#define NIL 0x01010101

int a[1000001], f[1000001];
int q[1000001], l;

int main()
{
	int n, t, i, j, imax ;
	double tt;
	//freopen( "//home//administrator//2.in", "r", stdin );
	scanf( "%d", &t );
	while ( scanf( "%d", &n ) != EOF )
	{
		memset( f, 1, sizeof( f ) );
		for ( imax=i=0; i<n; i++ )
		{
			scanf( "%d", &a[i] );
			if ( imax < a[i] ) imax = a[i];
		}
		l = -1;
		for ( i=0; i<n; ++i )
		{
			while ( l >= 0 && a[i] >= a[q[l]] )
			{
				/×如果当前值等于栈中元素,则它最近距离为它到与它相等的距离+那个相等的数的最近距离×/
				if ( a[i] == a[q[l]] )
				{
					f[i] = f[q[l]]+i-q[l];
					break;
				}
				/×如果最短距离可以更新*/
				if ( f[q[l]] > i-q[l] )
					f[q[l]] = i-q[l];
				l--;
			}
			/*找到栈中比a[i]大的数,记录距离*/
			if ( l != -1 && a[i] != a[q[l]] ) f[i] = i-q[l];
			/*入栈*/
			q[++l] = i;
		}
		tt = 0;
		for ( i=0; i<n; ++i )
		{
			if ( a[i] == imax || f[i] == NIL ) f[i] = n;
			tt += f[i];
		}
		/*注意进位*/
		printf( "%.2f\n", ( tt*100+0.5 )/100/n );
	}
	return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee