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;
}
浙公网安备 33010602011771号