C++基本有关问题

C++基本问题
有N个整数:a[1] a[2] ... a[N].每次从队列的头或尾取出一个数,形成新的队列b[1] b[2] ... b[N],然后求结果sum=b[1]*1+b[2]*2+b[N]*N,编程求最大和并输出。另:输入的N不大于2000,输入的数a[i]不大于1000且大于0

我的解决方案:
1.设定和sum=0,取出的数的权multiple=1
2.每次查看头尾,取较小的出来乘以权然后加到和,如果是头则向前移动,如果是尾则向后移动
3.如果头(i位置)尾(j位置)等值,那头继续向前,尾继续向后比较,直到找到不相等的(头:ii位置,尾jj位置),然后取出不相等时刻较小的一边(i或j位置),乘以权然后加到和
4.如果头尾位置值一直相等直到头位置i>=尾位置j,这时候有两种情况:(1)所有的数都相等,那就可以从头位置到尾位置逐一取数;(2)中间还有个数,其他两边都想等。此时又有两种情况,中间的数大,那就先取两边的数,最后取中间;如果中间的数小,就从头到尾取。
下面是代码实现:
#include<iostream>
using namespace std;
int main(){
  int n;
while(cin>>n){  
int num[2001];
for(int i(1);i<=n;i++)cin>>num[i];
double sum(0);
int multiple(1);
for(int i(1),j(n);i<=j;){
if(num[i]==num[j]){
int ii=i,jj=j;
while(num[ii]==num[jj]&&ii<jj){
ii++;jj--;
}
if(ii>=jj){//两边都相等
if(ii>jj){//没有中间
while(i<=j){
sum+=num[i++]*multiple++;
}
}else{//中间还有一个
if(num[ii]>num[i]){//中间的数比较大,留在最后
bool jump=1;
for(;i<ii;i++,j--){
sum+=num[i]*multiple++;
sum+=num[j]*multiple++;
}
sum+=num[ii]*multiple++;
}else{//中间比较小,从左往右
for(;i<=j;i++){
sum+=num[i]*multiple++;
}
}
}
break;
}else{
if(num[ii]<num[jj]){
sum+=num[i++]*multiple++;
}else{
sum+=num[j--]*multiple++;
}
}
}else
if(num[i]<num[j]){
sum+=num[i++]*multiple++;
}else{
sum+=num[j--]*multiple++;
}
}
cout<<sum<<endl;
}
system("pause");
  return 0;
}
我测试了几组数据,结果都是正确的,但放到系统里测试,结果说答案错误,我不知道错在哪里。劳请大师指教!多谢

------解决方案--------------------
个人觉得也是对的
------解决方案--------------------
主要是头尾相等的情况下,先取哪边;
这个题目有点意思
------解决方案--------------------
是acm的题目吧?
不做好多年,不过建议看看是不是有可能有精度问题
double 虽然范围够大,可是超过一定大小精度就不大够了

如果在范围内,换用__int64 long long 看看
------解决方案--------------------
额……惭愧惭愧,看错了。我再想想。老了。不行了。

探讨
你的想法是错误的。我做这么一个假设:如果a[N]这个数非常之大,那么,正确的做法,应该要保证a[N]*N,那么得到的结果才是最大的,这样,就应该一直从头取到尾,而不能取a[N]*1

------解决方案--------------------
是不是数据溢出了??
------解决方案--------------------
没学过唉.....接分