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
",maxx) ;
    }
    return 0 ;
}


 

原文地址:https://www.cnblogs.com/vermouth/p/3832198.html