poj 3276--Face The Right Way(反转)

有n头牛,其中有一些朝向背面,可以翻动连续的k头牛,求反转次数最小并求那时的k值。

http://poj.org/problem?id=3276

首先,每一个区间最多反转1次,多余的反转是无效的。

从最左边的牛开始考虑,如果它朝向背面则需要翻动区间[i, i + k - 1], 否则就不用翻动。

设f[i]为区间[i, i + k - 1]是否需要反转,需要为1,不需要为0。

考虑第i头牛是否需要翻动,只要知道这头牛最初的朝向及 ∑(j=i-k+1~j=i-1)f[j]

∑(j=(i+1)-k+1~j=(i+1)-1)f[j] = ∑(j=i-k+1~j=i-1)f[j] + f[i] - f[i-k+1]

再考察[n - k + 1, n - 1]的牛是否都以反转,来判断k值是否成立。

#include 
#include 
#include 
using namespace std;
const int maxn = 5000 + 10;
int n, k, ans, K, f[maxn], res;
char ch[2];
bool dir[maxn];
int main(){
    scanf("%d", &n);
    ans = 0; K = 1;
    for(int i=0; i= 0) sum -= f[i - k + 1];
        }
        for(int i=n-k+1; i= 0) sum -= f[i - k + 1];
        }
        if(~res && res < ans){
            ans = res;
            K = k;
        }
    }printf("%d %d\n", K, ans);
    return 0;
}


你可能感兴趣的:(poj,常用技巧)