反转法_Face The Right Way(POJ.3276)

来源:互联网 发布:中公教育网络课程 编辑:程序博客网 时间:2024/06/06 03:56

题目链接:http://poj.org/problem?id=3276

题意:给定n头牛的朝向,每次反转k头牛,使得所有牛的朝向都为F,输出反转次数最小时的k和m(一定有解)

思路:同一个区间反转 两次及以上是多余的,区间反转的顺序对结果没影响

#include <cstdio>#include <iostream>#include <string.h>using namespace std;#define INF 0x3f3f3f3fint dir[5050]={0};int fz[5050]={0};int n;int face(int k){    int sum=0;    int ans=0;    memset(fz,0,sizeof(fz));  //注意每次调用face函数都要重置fz    for(int i=0;i<n-k+1;i++)    {        if((dir[i]+sum)%2!=0)        {            fz[i]=1;            ans++;        }        sum+=fz[i];        if(i-k+1>=0)        {            sum-=fz[i-k+1];        }    }    for(int i=n-k+1;i<n;i++)    {        if((dir[i]+sum)%2!=0)            return -1;            if(i-k+1>=0)        {            sum-=fz[i-k+1];        }    }    return ans;}void solve(){    int m=INF;    int ans=0;    int k;    for( k=1;k<=n;k++)    {        if(face(k)!=-1 && face(k)<m)        {            m=face(k);            ans=k;        }    }    printf("%d %d\n",ans,m);}int main(){    cin>>n;    for(int i=0;i<n;i++)    {        char tmp;        getchar();        scanf("%c",&tmp);        if(tmp=='B')            dir[i]=1;        else            dir[i]=0;    }    solve();    return 0;}

0 0
原创粉丝点击