这题昨晚感觉不知道为什么数组开成5000+多点会RE,最后尝试到8000多也还是RE了,题目要求是N=5000;
最后干脆开50000,AC。下面是代码
#include <map>
#include <set>
#include <list>
#include <cmath>
#include<cctype>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b)
{
return a % b == 0 ? b : gcd(b, a % b);
}
long long ans;
int N;
int a[5050];
int front,rear;
void insert(int x)//将新计算的和插入到原数组
{
int i;
for ( i=front;i<=rear;i++)
if (a[i]>=x) break;
if (i==rear+1)
a[rear+1]=x;
else
{
for (int j=rear;j>=i;j--)
a[j+1]=a[j];
a[i]=x;
}
}//不再辅助函数中更新front,rear
void slove()
{
ans=0;
front=0,rear=N-1;//对数组更新进行限制
while (front<rear)
{
ans+=a[front]+a[front+1];
insert(a[front]+a[front+1]);
front+=2;
rear++;
}
printf("%lld\n",ans);
}
int main()
{
while (scanf("%d",&N)==1)
{
if (N==0) break;
for (int i=0;i<N;i++)
scanf("%d",&a[i]);
sort(a,a+N);
slove();
}
return 0;
}