2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A题 Bit String Reordering(暴力)
2015-11-09 19:30
232 查看
题目大意:
给出一串0/1序列,连续的几个0或者1可以计数相加,比如0 0 1 1 1 0,就是2 3 1。相邻的数之间可以交换,现在通过一系列变换以后可以达到某一种情况,比如例子里面:如果要求变成3 3,那就是把最后那个0放到前面和前面两个0相邻。问最少需要几步。
思路:
题目范围比较小,N<=15。所以考虑暴力。
我们可以自己构造出所要求的序列,无非就是两种情况。然后去一位位 比较,如果当前位不同,则往后寻找一个相同的,然后交换,过程中记录步数。最后对于两种情况进行判定,选小的那个。当然如果某一组不符合实际情况,就选另一组。
代码:
给出一串0/1序列,连续的几个0或者1可以计数相加,比如0 0 1 1 1 0,就是2 3 1。相邻的数之间可以交换,现在通过一系列变换以后可以达到某一种情况,比如例子里面:如果要求变成3 3,那就是把最后那个0放到前面和前面两个0相邻。问最少需要几步。
思路:
题目范围比较小,N<=15。所以考虑暴力。
我们可以自己构造出所要求的序列,无非就是两种情况。然后去一位位 比较,如果当前位不同,则往后寻找一个相同的,然后交换,过程中记录步数。最后对于两种情况进行判定,选小的那个。当然如果某一组不符合实际情况,就选另一组。
代码:
#include<stdio.h> #include<string.h> int main() { int n,m,i,j,k,a[30],b[30],v[2][30],c[30]; while(scanf("%d%d",&n,&m)!=EOF) { memset(v,0,sizeof(v)); for(i=1;i<=n;i++) { scanf("%d",&a[i]); c[i]=a[i]; } for(i=1;i<=m;i++) scanf("%d",&b[i]); k=1; for(i=1;i<=m;i++) for(j=1;j<=b[i];j++) { if(i%2) {v[0][k]=0; v[1][k]=1; k++; } else { v[0][k]=1;v[1][k]=0; k++; } } int t1,t2; t1=t2=0; for(i=1;i<=n;i++) { if(a[i]!=v[0][i]){ j=i+1; while(1) { if(j>n)break; t1++; if(a[j]==v[0][i]){ int x=a[i]; a[i]=a[j]; a[j]=x; break; } j++; if(j>n)break; } } } for(i=1;i<=n;i++) { if(c[i]!=v[1][i]){ j=i+1; while(1) { if(j>n)break; t2++; if(c[j]==v[1][i]){ int x=c[i]; c[i]=c[j]; c[j]=x; break; } j++; if(j>n)break; } } } int f1,f2; f1=f2=0; for(i=1;i<=n;i++) if(a[i]!=v[0][i]){f1=1; break; } for(i=1;i<=n;i++) if(c[i]!=v[1][i]){ f2=1; break; } if(f1==0&&f2==0){ if(t1>t2)printf("%d\n",t2); else printf("%d\n",t1); } else if(f1&&f2==0)printf("%d\n",t2); else if(f2&&f1==0)printf("%d\n",t1); } }
相关文章推荐
- [实战]MVC5+EF6+MySql企业网盘实战(15)——逻辑重构2
- 大数据架构之:Spark
- JAVA反射机制的学习
- C++ 二值图像连通区域标记
- NSString 常用方法
- SSIS 数据并发处理
- 编程之美-子数组的最大乘机方法整理
- hdu4770 Lights Against Dudely
- 软考总结篇
- 三子棋
- linux下X86架构IDT解析
- 红黑树算法的实现与剖析
- UIAlertView弹出框的简单使用
- javascript函数sort
- 文件读写
- c语言中统计二进制位中1的个数的算法优化
- Theano:线性回归
- oc 数组杂记
- .net 后台提交表单,获取返回结果
- GCD中的线程死锁问题