Codeforces Round #243 (Div. 2) C. Sereja and Swaps
枚举可能的区间,然后从区间内和区间外交换最小和最大的。
#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 ; }