题很简单,思路也不难,就是一个贪心,但是第一次写用最直观的模拟,结果导致了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;
}