题目链接: http://codeforces.com/contest/425/problem/A
题目意思:第一行用户输入 n 和 k, 代表 n 个数, 最大 k 次交换
求交换 i 次 后, 在 n 个数中连续的 m 个数的和最大。
思路: 因为题目数数据量很小 n <= 200 。故可以直接暴力模拟。假设找的连续区间是 i ~ j,找 0~i-1中 和 j+1 ~ n 中的最大值,以及 i ~j 中的最小值,如果 最大值比最小值小,则可以不继续进行查找交换操作。
下面是我写的代码:
/* ****
* @ Codeforce Problem 425A.c Sereja and Swaps
* @ 2014.5.11
*******/
#include <stdio.h>
#define INF 1000000000
int maxIndex(int a[], int ib, int ie){
int i, t;
for(i = t = ib; i <= ie; ++i){
if(a[i] > a[t])
t = i;
}
return t;
}
int minIndex(int a[], int ib, int ie){
int i, t;
for(i = t = ib; i <= ie; ++i)
if(a[i] < a[t])
t = i;
return t;
}
int fa(int a[], int ib, int ie){
int i, t;
for(i = ib, t = 0; i <= ie; ++i)
t += a[i];
return t;
}
int main(){
//freopen("input.in", "r", stdin);
//freopen("output.out", "w", stdout);
int i, j, tk, n, k, p, ans = -INF;
scanf("%d%d", &n, &k);
++n;
int a[n+5], b[n+5];
for(i = 1; i < n; ++i)
scanf("%d", b+i);
b[0] = b[n] = -INF;
for(i = 1; i < n; ++i){
for(j = i; j < n; ++j){
for(p = 0; p <= n; ++p)
a[p] = b[p];
tk = k;
while(tk-- > 0){
int leftMax = maxIndex(a, 0, i-1);
int rightMax = maxIndex(a, j+1, n);
int indexMax = a[leftMax] < a[rightMax] ? rightMax : leftMax;
int indexMin = minIndex(a, i, j);
//printf("tk = %d, i = %d, j = %d, indexMax = %d, indexMin = %d\n", tk, i, j, indexMax, indexMin);
if(a[indexMax] <= a[indexMin])
break;
else{
int temp = a[indexMax];
a[indexMax] = a[indexMin];
a[indexMin] = temp;
}
}
int maxAns = fa(a, i, j);
if(maxAns > ans)
ans = maxAns;
//printf("ans = %d\n", ans);
}
}
printf("%d", ans);
return 0;
}
后记: 代码写的很烂,以后再逻辑思维方面还要加强。