枚举可能的区间,然后从区间内和区间外交换最小和最大的。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std ;
int a[1010] ;
int main()
{
int n ,k;
while(~scanf("%d %d",&n,&k))
{
for(int i = 1 ; i <= n ; i++)
scanf("%d",&a[i]) ;
int maxx = -9999999,sum ;
for(int i = 1 ; i <= n ; i++)
{
for(int j = i ; j <= n ; j++)
{
sum = 0 ;
vector<int > v ,u;
for(int h = i ; h <= j ; h++)
{
v.push_back(a[h]) ;
sum += a[h] ;
}
maxx = max(maxx,sum) ;
for(int h = 1 ; h <= n ; h++)
{
if(h < i || h > j)
u.push_back(a[h]) ;
}
sort(v.begin(),v.end()) ;
sort(u.begin(),u.end()) ;
reverse(u.begin(),u.end()) ;
for(int h = 1 ; h <= k && h <= v.size() && h <= u.size() ; h++)//枚举交换次数
{
if(v[h-1] < u[h-1])
{
sum -= v[h-1] ;
sum += u[h-1] ;
maxx = max(sum,maxx) ;
}
}
}
}
printf("%d\n",maxx) ;
}
return 0 ;
}