求子集的最大值和最小值之和,并返回最大的和

img


输出7


#include
using namespace std;
int n;
vector<int>p;
vector<long int>sum;

int main()
{
    scanf("%d",&n);
    int *a=(int*)malloc(n*sizeof(int));
    int max,min;
    int count=0;
    for(int i=0;iscanf("%d",&a[i]);
    }
    for(int i=0; i<(1<for(int j=0; jif(i&(1<1<<(j-1))||i&(1<<(j+1))))
            {
                p.push_back(a[j]);
            }
        }
       int c=-1; 
       vector<int>::iterator itMax=p.begin();
       for(itMax;itMax!=p.end();itMax++)
       {
               if(c<*itMax)
               c=*itMax;
       }
       int d=c+1;
       vector<int>::iterator itMin=p.begin();
       for(itMin;itMin!=p.end();itMin++)
       {
           if(d>*itMin)
           d=*itMin;
       }
       sum.push_back(c+d);
        p.clear();
       
    }
 vector<long int>::iterator it=sum.begin();
 long int k=-1;
 for(it;it!=sum.end();it++)
 {
     if(k<*it)
     k=*it;
 }

  printf("%ld",k);
  
    return 0;
}
范例都过了,但一运行就显示答案错误
思路是先用二进制法求子集,并判断前一个和后一个元素是否在子集内得到元素连续的子集,将子集存储到vector中,判断完一个子集的最大最小值之和就清空vector,储存下一个子集,功力太浅,想不出比这更好的办法了

运行时长已经无所谓了,看这个都看麻了,只想保证结果正确,希望有人能看看到底什么地方导致结果不对,感谢感谢

这题应该没题主想的那么复杂

int n;
int main(void)
{
    scanf("%d",&n);
    int *a=(int*)malloc(n*sizeof(int));
    int max,min;
    int count=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

    long long k = 0;
    for(int i=0; i< n; i++)
    {
        long long min = a[i], max = a[i];
        for (int j = i + 1; j < n; j++) {
            min = min > a[j] ? a[j] : min;
            max = max < a[j] ? a[j] : max;
            long long t = min + max;
            k = t > k ? t : k;
        }
    }
    printf("%lld",k);
    return 0;
}

需要把 sum改为vector<long long>类型。然后:
 vector<long long>::iterator it=sum.begin();
 long long k=-1;
 for(it;it!=sum.end();it++)
 {
     k+=*it;
 }
 
  printf("%lld",k);

这题有时间限制的