2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A題:Bit String Reordering [bfs]
2015-11-07 17:35
507 查看
題意:給出N個0/1,以及M個數Ai,表示目標狀態從左至右每Ai個數是相同的,每次可以交換相鄰兩個0/1,問最少幾步可以達到目標狀態。
範圍:N<=15
解法:直接bfs,因为状态至多2的15次,每次BFS到一个状态,求一下当前状态是否满足要求即可,复杂度2的N次*logN
代码:
範圍: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; }
相关文章推荐
- PowerShell介绍 第十二回 函数
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)
- 烂泥:haproxy与nginx、zabbix集成
- python之函数用法vars()
- mysql学习笔记(2)
- zoj 1610 Count the Colors
- 【转】nat 穿透原理
- MVC4学习-View(0)
- 典型用户
- ——黑马程序员——OC加强部分 内存管理
- 短信验证 掌淘 mob 1.1.1开发实例
- Android项目中如何用好构建神器Gradle?
- linux下奇怪的“重名”文件
- 利用sql语句对数据库进行操作
- 把带横杠的字符串转为驼峰字符串
- 87位随机字符串
- MFC程序运行原理
- Deep Learning 8_深度学习UFLDL教程:Stacked Autocoders and Implement deep networks for digit classification_Exercise(斯坦福大学深度学习教程)
- Linux内核模块编程-字符设备驱动
- 解决Studio引用友盟引起的/jdk1.8.0_45.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2