Codeforces 425A Sereja and Swaps(暴力)

暴力枚举区间起止点,标记区间内元素出现过,对原数组和区间数组都排序,用原数组最大的未被标记的元素依次去换区间中最小的。


代码:

#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;
}

你可能感兴趣的:(Codeforces 425A Sereja and Swaps(暴力))