uva10954 - Add All

来源:互联网 发布:windows update不更新 编辑:程序博客网 时间:2024/05/02 05:05

不错的题目,

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

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

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

然后经历了TLE-RE->AC

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

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

代码如下:

#include <cstdio>#include <algorithm>using namespace std;#define INF 0x7fffffffconst 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;}