uva 11054

题很简单,思路也不难,就是一个贪心,但是第一次写用最直观的模拟,结果导致了TLE,必然,数据量大概是100000,我的程序大概最坏的话应该是个O(n2)TLE 了

这是我的TLE代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int a[200000];
long long cost;
int n;
inline int abs( int a )
{
	if( a < 0 )
		return -a;
	else
		return a;
};
int choose_max( void )
{
	int min = 9999, sub;
	for( int i = 0; i < n; i++ )
		if( a[i] < min )
		{
			min = a[i];
			sub = i;
		}
	return sub;
};
int check( void )
{
	for( int i = 0; i < n; i++ )
		if( a[i] != 0 )
			return 1;
	return 0;
};
void deal()
{
	int l, i, j, temp;
	while( check() )
	{
		l = choose_max();
		i = l+1;
		j = l-1;
		while( abs(a[l]) )
		{
			if( a[i] <= 0 && a[j] <= 0 )
			{
				i++;j--;
				continue;
			}
			else
			{
				if( a[i] > a[j] )
				{
					if( a[i] > abs(a[l]) )
					{
						cost += (i-l)*abs(a[l]);
						a[i] += a[l];
						a[l] = 0;
					}
					else
					{
						cost += (i-l)*a[i];
						a[l] += a[i];
						a[i] = 0;
						i++;
					}			
				}
				else
				{
					if( a[j] > abs(a[l]) )
					{
						cost += (l-j)*abs(a[l]);
						a[j] += a[l];
						a[l] = 0;
					}
					else
					{
						cost += (l-j)*a[j];
						a[l] += a[j];
						a[j] = 0;
						j--;
					}
				}
			}
		}
	}
};
int main()
{
	while( scanf( "%d", &n ) && n )
	{
		cost = 0;
		for( int i = 0; i < n; i++ )
			scanf( "%d", &a[i] );
		deal();
		printf( "%d\n", cost );
	}
	return 0;
}

目前这再考虑能否剪枝或者用更好的贪心策略

下面是参考的贪心策略

我的贪心策略是找最小的距离,它的贪心策略是距离都为1,即最小,但是它的货物量是累加的,所以理论上是等价的。

#include <stdio.h>
long long cost;
int a[200000];
int n;
inline int abs( int a )
{
	if( a < 0 )
		return -a;
	else
		return a;
};
void deal()
{
	for( int i = 0; i < n; i++ )
	{
		cost += abs(a[i]);
		a[i+1] += a[i];
	}
};
int main()
{
	while( scanf( "%d", &n ) && n )
	{
		cost = 0;
		for( int i = 0; i < n; i++ )
			scanf( "%d", &a[i] );
		deal();
		printf( "%lld\n", cost );
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值