uva10954 - Add All

不错的题目,

一开始的时候题意理解不清,看discuss才知道某些隐藏的题意。

就是每次从现成的数列中选取最小的两个数相加,然后把新的数也加入到数列中,并把原来的两个数删掉。

算法,既然开一个数组,新的成员很难加入,那就开两个数组,把所有的新成员加到新数组里,然后比较的时候也得把新数组里的数考虑进去。

然后经历了TLE-RE->AC

TLE是因为我用的通用算法,每次都排序。

RE是因为我在循环中忘了加限制条件,

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 0x7fffffff
const int size = 5000+10;
long long a[size], b[size];
int main ()
{
    int n, arear, brear, bfront;
    long long sum, tt;
    while(scanf("%d",&n)&&n)
    {
        for(int i = 0; i < n; i++) scanf("%lld",&a[i]);
        sort(a,a+n);
        b[0] = a[0]+a[1]; sum = b[0]; b[1] = INF;//important!!!
        arear = 2; brear = 0; bfront = 1;
        while(1)
        {
            if(arear<n&&a[arear]<=b[brear]) tt = a[arear++];
            else tt = b[brear++];
            if(arear<n&&a[arear]<=b[brear]) tt += a[arear++];
            else tt += b[brear++];
            b[bfront++] = tt; b[bfront] = INF;//important!!!
            sum+=tt;
            if(arear==n&&bfront-brear==1) break;
        }
        printf("%lld\n",sum);
    }
    return 0;
}


你可能感兴趣的:(uva10954 - Add All)