Codeforces Problem 425. Sereja and Swaps

题目链接: 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;
}


后记: 代码写的很烂,以后再逻辑思维方面还要加强。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值