***POJ 3276【反转】

来源:互联网 发布:网络麻将群主违法吗 编辑:程序博客网 时间:2024/06/03 13:35

这里写链接内容

思路:转向的先后顺序不影响结果;同一头牛转向两次等同于没有转向。

AC代码:

#include <iostream>#include <algorithm> #include <cstdio>#include <cstdlib>#include <cstring>int n, dir[5000], f[5000], ans_m, ans_k;int reverse(int k){  //计算每次反转k头牛所需的最小反转次数     int res = 0, sum = 0;  //res是返回值,即最小反转次数;sum为每头牛的反转次数     memset(f, 0, sizeof(f));  //sizeof(f)或4*n,不能写成n!    for(int i = 0; i + k - 1 < n; i++){        if((dir[i] + sum)%2 != 0){            res++;            sum++;            f[i] = 1;        }        if(i + 1 - k >= 0)  sum -= f[i + 1 - k];    }    for(int i = n + 1 - k; i < n; i++){        if((dir[i] + sum)%2 != 0)  return -1;        if(i + 1 - k >= 0)  sum -= f[i + 1 - k];    }    return res;} int main() {    scanf("%d", &n);    for(int i = 0; i < n; i++){        char ch;        getchar();        scanf("%c", &ch);        if(ch == 'B')  dir[i] = 1;        else dir[i] = 0;    }    ans_m = n + 1;    for(int i = 1; i <= n; i++){        int m = reverse(i);  //每次反转i头牛         if(m >= 0 && m < ans_m){            ans_m = m;            ans_k = i;        }        else if(m == ans_m && i < ans_k){            ans_k = i;         }    }    printf("%d %d\n", ans_k, ans_m);    return 0;}
1 0
原创粉丝点击