Comet OJ - Contest #3 B -棋盤 (思惟+分類討論)

題目描述html

 

小貓有一個 2\times N2×N 的棋盤,每個格子放着一個黑棋子或白棋子。ios

小熊以爲小貓的棋盤不夠好看,想要把棋盤上的一部分白棋子替換成黑棋子,使得全部黑棋子都可以在僅容許上下左右四個方向走,且僅通過黑棋子在的格子的狀況下兩兩互相到達。markdown

小熊想知道至少要將多少個白棋子替換成黑棋子。flex

注意:不能將黑棋子替換成白棋子。spa

 

 
 

輸入描述code

 

第一行有一個正整數 NN (1 \le N \le 10^51N105)。htm

接下來兩行,每行 NN 個整數,描述整個棋盤。若第 ii 行的第 jj 個整數是 00,表明棋盤 (i,j)(i,j) 的位置放着白棋子,如果 11 則放着黑棋子。blog

數據保證至少存在一個黑棋子。ip

 

輸出描述ci

 

輸出一行包含一個整數,表示答案。

 

樣例輸入 1 

3
1 0 0
0 0 1

樣例輸出 1

2

樣例輸入 2 

5
0 1 0 1 0
0 0 1 0 0

樣例輸出 2

1

提示

樣例一中能夠將第一行的兩個白棋子替換成黑棋子。

樣例二中能夠將位置 (1, 3)(1,3) 的白棋子換成黑棋子。

 

思路:

因爲題目說這個矩陣只有兩行,咱們知道,對於每一列,2塊方格,有4個組合方式,

有1的列,只有如下三個方式是可能須要變化前面的白棋子的。

分別是:

兩個1

上0下1

上1下0

 

若是是兩個1,咱們能夠從上一個有1的位置,直線鏈接過來到當前的一個1,記上一個1出來的位置是last 

則對答案的貢獻是 i-last-1 

若是上1下0,咱們須要根據last位置的1是什麼狀況,。若是上行有1,那麼貢獻是  i-last-1 不然是 i-last

上0下1 和上面同樣來處理便可。

每遇到一列有1就去維護 last 和 1在上仍是在下的信息Pos

 

細節見代碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int a[maxn][4];
int n;
int main()
{

    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
    //freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
    gbtb;
    cin>>n;
    int r=-1;
    int l=inf;
    repd(j,0,1)
    repd(i,1,n)
    {
        cin>>a[i][j];
        if(a[i][j])
        {
            r=max(r,i);
            l=min(l,i);
        }
    }
    int last=l;
    int pos;
    if(a[l][0]==a[l][1])
    {
        pos=2;
    }else if(a[l][0])
    {
        pos=0;
    }else
    {
        pos=1;
    }
    int ans=0;
    // cout<<l<<" "<<r<<endl;
    repd(i,l+1,r)
    {
        if(a[i][0]||a[i][1])
        {
            if(a[i][0]==a[i][1])
            {
                pos=2;
                ans+=i-last-1;
            }else if(a[i][0])
            {
                if(pos==0)
                {
                    pos=0;
                    ans+=i-last-1;
                }else if(pos==1)
                {
                    pos=2;
                    ans+=i-last;
                }else
                {
                    pos=0;
                    ans+=i-last-1;
                }
            }else if(a[i][1])
            {
//                db(pos);
                if(pos==1)
                {
                    pos=1;
                    ans+=i-last-1;
                }else if(pos==0)
                {
//                    db(last);
                    ans+=i-last;
                    pos=2;
                }else
                {
                    pos=1;
                    ans+=i-last-1;
                }
            }
            last=i;
        }
    }
    cout<<ans<<endl;
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}
相關文章
相關標籤/搜索