暴力枚举区间起止点,标记区间内元素出现过,对原数组和区间数组都排序,用原数组最大的未被标记的元素依次去换区间中最小的。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long
#include <algorithm>
#include <vector>
int a[205];
struct node{
int n,id;
}G[205],ord[205];
int N,K;
bool vis[205];
bool cmp(node a,node b){
return a.n>b.n;
}
int main(){
scanf("%d%d",&N,&K);
int pnum=0;
for(int i=1;i<=N;i++){
scanf("%d",&G[i].n);
G[i].id=i;
ord[i].n=G[i].n;
ord[i].id=G[i].id;
}
sort(ord+1,ord+N+1,cmp);
int res=-10000000;
for(int i=1;i<=N;i++){
for(int j=i;j<=N;j++){
vector<node> cur;
memset(vis,0,sizeof(vis));
int sum=0;
for(int k=i;k<=j;k++){
sum+=G[k].n;
vis[G[k].id]=1;
cur.push_back(G[k]);
}
sort(cur.begin(),cur.end(),cmp);
int pos=cur.size()-1;
int tk=K;
for(int k=1;k<=N;k++){
if(tk==0) break;
if(ord[k].n<=cur[pos].n||pos==0) break;
if(!vis[ord[k].id]){
sum-=cur[pos].n;
sum+=ord[k].n;
pos--;
tk--;
}
}
res=max(res,sum);
}
}
printf("%d",res);
return 0;
}
393

被折叠的 条评论
为什么被折叠?



