本题思路:
先暴力枚举出每一个区间求出未交换前的状态取得最大值 再对区间外和区间内的数进行排序 取出区间内的最小的数和区间
外的数从而使得区间的和尽可能的大
题目描述
(中文翻译版本)
给定数组a,最多交换k次,求a的最大区间和。
一次交换是指,选择两个数,交换它们的位置。
区间和是指,选择一个左端点l和一个右端点r,计算出的a[l]+a[l+1]+…+a[r]的值。
Input
第一行两个整数n,k ( 1 ≤ n ≤ 200 ; 1 ≤ k ≤ 10 ),其中n是数组元素个数。
第二行n个整数(绝对值不超过1000)
Output
输出最大区间和
样例
Input
10 2
10 -1 2 2 2 2 2 2 -1 10
Output
32
Input
5 10
-1 -1 -1 -1 -1
Output
-1
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
using namespace std;
int num[210];
vector<int> v,vv;
int ans,res=-0x3f3f3f3f;
int main()
{
int n,chance;
cin>>n>>chance;
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
v.clear(),vv.clear(),ans=0;//每次操作前都要记得初始化
for(int k=i;k<=j;k++)
{
v.push_back(num[k]);
ans+=num[k];
}
for(int k=1;k<=n;k++)
if(k<i||k>j) vv.push_back(num[k]);//将区间外的点push进去
sort(v.begin(),v.end());//排序是为了取出v中最小的点和vv中最大的点 从而使得值最大
sort(vv.begin(),vv.end());
int len1=v.size(); int len2=vv.size();
res=max(res,ans);
for(int k=1;k<=chance&&k<=len1&&k<=len2;k++)
{
ans-=v[k-1];
ans+=vv[len2-k];
res=max(res,ans);
}
}
cout<<res<<endl;
return 0;
}