2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A題:Bit String Reordering [bfs]

来源:互联网 发布:金融界免费炒股软件 编辑:程序博客网 时间:2024/06/05 02:21

題意:給出N個0/1,以及M個數Ai,表示目標狀態從左至右每Ai個數是相同的,每次可以交換相鄰兩個0/1,問最少幾步可以達到目標狀態。

範圍:N<=15

解法:直接bfs,因为状态至多2的15次,每次BFS到一个状态,求一下当前状态是否满足要求即可,复杂度2的N次*logN


代码:

#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#include<iostream>#include<stdlib.h>#include<set>#include<map>#include<queue>#include<vector>#include<bitset>#pragma comment(linker, "/STACK:1024000000,1024000000")template <class T>bool scanff(T &ret){ //Faster Input    char c; int sgn; T bit=0.1;    if(c=getchar(),c==EOF) return 0;    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();    sgn=(c=='-')?-1:1;    ret=(c=='-')?0:(c-'0');    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');    if(c==' '||c=='\n'){ ret*=sgn; return 1; }    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;    ret*=sgn;    return 1;}#define inf 1073741823#define llinf 4611686018427387903LL#define PI acos(-1.0)#define lth (th<<1)#define rth (th<<1|1)#define rep(i,a,b) for(int i=int(a);i<=int(b);i++)#define drep(i,a,b) for(int i=int(a);i>=int(b);i--)#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)#define mem(x,val) memset(x,val,sizeof(x))#define mkp(a,b) make_pair(a,b)#define findx(x) lower_bound(b+1,b+1+bn,x)-b#define pb(x) push_back(x)using namespace std;typedef long long ll;typedef pair<int,int> pii;int n,m;int eds1,eds2;int b[111],a[111];int q[111111];int head,tail;int dis[111111];int t[111];int swapx(int x,int y){    swap(t[x],t[y]);    int ret=0;    drep(i,n,1){        ret=ret<<1|t[i];    }    swap(t[x],t[y]);    return ret;}bool vis[111111];void bfs(int root){    rep(i,1,33000)dis[i]=inf;    head=tail=0;    q[tail++]=root;    dis[root]=0;    while(head<tail){        int st=q[head++];        int x=st;        vis[x]=1;        rep(i,1,n){            t[i]=x&1;            x>>=1;        }        rep(i,1,n-1){            int nst;            nst=swapx(i,i+1);            if(!vis[nst]){                vis[nst]=1;                q[tail++]=nst;                dis[nst]=min(dis[st]+1,dis[nst]);            }        }    }}int c1[111],c2[111];int main(){    scanff(n);    scanff(m);    rep(i,1,n)scanff(a[i]);    int st=0;    int x;    eds1=eds2=0;    int pd=0;    int tot=0;    rep(i,1,m){        pd^=1;        scanff(x);        rep(j,1,x){            tot++;            c1[tot]=pd;            c2[tot]=pd^1;        }    }    drep(i,n,1){        eds1=eds1<<1|c1[i];        eds2=eds2<<1|c2[i];    }    drep(i,n,1){        st=st<<1|a[i];    }    bfs(st);    printf("%d\n",min(dis[eds1],dis[eds2]));    return 0;}



0 0
原创粉丝点击