UVa:11054 Wine trading in Gergovia

以前一直不会做,今天胡乱写了个算法居然AC了。。

从左往右扫描,对于每个负数就找一个正数来填,注意不要越界。

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define MAXN 100005
#define MOD 1000000007
#define INF 2139062143
#define ll long long
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)&&n)
    {
        int arr[MAXN]= {0};
        for(int i=0; i<n; ++i)
            scanf("%d",&arr[i]);
        ll ans=0;
        for(int i=0,j=0; i<n;)
        {
            while(arr[i]>=0&&i<n) i++;
            while(arr[j]<=0&&j<n) j++;
            ll minn=min(abs(arr[i]),arr[j]);
            ans=ans+abs(i-j)*minn;
            arr[i]=arr[i]+minn;
            arr[j]=arr[j]-minn;
        }
        printf("%lld\n",ans);
    }
    return 0;
}


 

你可能感兴趣的:(高效算法)