2016年10月16日 星期日

(POJ) 3276 -- Face The Right Way

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


#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;

const int MAX_N = 5006;

int a[MAX_N];
int f[MAX_N];
int pre[MAX_N];

int main () {
    int n;
    while (scanf("%d",&n) != EOF) {
        bool check=false;
        for (int x=1;n>=x;x++) {
            getchar();
            char c;
            scanf("%c",&c);
            a[x] = (c=='B');
            if (a[x]) check=true;
        }
        if (!check) {
            puts("0 0");
            continue;
        }
        int ans1=n+1,ans2=-1;
        for (int k=1;n>=k;k++) {
//            cout<<"k = "<<k<<endl;
            memset(f,0,sizeof(f));
            memset(pre,0,sizeof(pre));
            int m=0;
            for (int x=1;n>=x;x++) {
//                cout<<"a["<<x<<"] = "<<a[x]<<endl;
//                cout<<"pre = "<<pre[max(x-1,0)] - pre[max(x-k,0)]<<endl;
//                cout<<"x = "<<x<<" , m = "<<m<<endl;
                if (x<=n-k+1) {
                    if ((a[x] + pre[max(x-1,0)] - pre[max(x-k,0)]) % 2 != 0) {
//                        cout<<"in2\n";
                        f[x]=1;
                        m++;
                    }
                }
                else {
                    if ((a[x] + pre[max(x-1,0)] - pre[max(x-k,0)]) % 2 != 0) {
                        m=-1;
                        break;
                    }
                }
                pre[x] = pre[x-1] + f[x];
            }
//            cout<<"f : ";
//            for (int x=1;n>=x;x++) cout<<f[x]<<' ';
//            cout<<endl;
            if (m!=-1 && ans1>m) {
                ans1=m;
                ans2=k;
            }
        }
        printf("%d %d\n",ans2,ans1);
    }
}


沒有留言:

張貼留言