CodeForces 230C Shifts
来源:互联网 发布:住院号软件查询 编辑:程序博客网 时间:2024/05/01 14:58
题目:大意是说给定n行序列,每行序列只由0和1组成,每行序列可以向左循环移动,也可以向右循环移动,问最小的移动次数使得有某一列全部元素为1.
题解:有人是用dp的方法做的,我不会,这里只介绍模拟的方法:就是将每一行的所有的1的位置记录下来,然后将每两个1之间的所有元素看看它们靠两侧哪个1近,然后记录最小移动次数即可,最后将每一列相加,求最小的即可。
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <vector>using namespace std;char s[110][10010];int t[110][10010];int main(){ int i=0,j,n,m; int l[10020],r[10020],flag=1; memset(r,0,sizeof(r)); cin>>n>>m; for(i=1;i<=n;i++) scanf("%s",s[i]); for(i=1;i<=n;i++) { memset(l,0,sizeof(l)); for(j=0;j<m;j++) if(s[i][j]=='1') l[++l[0]]=j; if(l[0]==0) { flag=0; break; } l[++l[0]]=l[1]+m; for(j=1;j<l[0];j++) { int k=(l[j]+l[j+1])/2; int p=l[j]; for(;p<=k;p++) r[p%m]+=p-l[j]; for(;p<=l[j+1];p++) r[p%m]+=l[j+1]-p; } } if(flag==0) cout<<"-1"<<endl; else{ int ans=-1; for(i=0;i<m;i++) if(ans==-1||ans>r[i]) ans=r[i]; cout<<ans<<endl; } return 0;}
0 0
- CodeForces 230C Shifts
- codeforces 230C Shifts DP
- Codeforces 230C Shifts(模拟)
- Codeforces 230C Shifts【思维】
- Codeforces 230C Shifts(模拟+展开字符串)
- codeforces 220c Little Elephant and Shifts
- Codeforces Round #142 (Div. 2) C. Shifts
- Codeforces Round #142 (Div. 2) C. Shifts
- Codeforces Round #142 (Div. 2) C. Shifts
- Shifts-Codeforces Round #142 (Div. 2) C (矩阵)
- C语言--Cleaning shifts
- Codeforces 229A Shifts 数据处理
- CodeForces Round #142(229A) - Shifts
- CF 220C Little Elephant and Shifts
- Codeforces 819 B. Mister B and PR Shifts
- Codeforces 819B. Mister B and PR Shifts
- CodeForces-820D Mister B and PR Shifts
- codeforces div2 round#230 C
- n方找n个数的区间中位数
- 五.4指向学生类的指针
- 一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(9)--基于表单库的仪表板
- [GPS模块]NEMA-0183(GPRMC GPGGA)数据格式详细解释
- 揭开Socket编程的面纱
- CodeForces 230C Shifts
- 做jQuery Easyui的demo本地化有感
- Struts2中的ModelDriven机制及其运用
- linux qq安装
- spring学习笔记6——JDBC模板
- Struts2 中的数据传输的几种方式
- delete与delete [] 真正区别
- 一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(10)--仪表板页面和内容查询Web部件
- Linux Socket编程(不限Linux)