UVALive 5809 Binary Matrix
2015-08-10 11:15
387 查看
题意:给出一个只有0和1的矩阵,相邻的2个位置(包括头和尾)可以交换,问通过最少的交换次数可以让每一行和每一列的1数目相同
思路:刚开始觉的要同时照顾行和列进行转换会很麻烦,看了别人的题解和代码,其实只要分别对行和列转换使其分别满足条件就可以了,要怎么使交换步数最少呢,参照某一道经典的换苹果题目,将其转换为到某一点距离最短,由于数据小,可以暴力一遍(不暴力用某个神奇的公式似乎也可以……但是没看懂),也有人用费用流做,同样不懂+_+
思路:刚开始觉的要同时照顾行和列进行转换会很麻烦,看了别人的题解和代码,其实只要分别对行和列转换使其分别满足条件就可以了,要怎么使交换步数最少呢,参照某一道经典的换苹果题目,将其转换为到某一点距离最短,由于数据小,可以暴力一遍(不暴力用某个神奇的公式似乎也可以……但是没看懂),也有人用费用流做,同样不懂+_+
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int row[1030],col[1030],tmp[1030],n,m; char mp[1030][1030]; int change(int now,int gold,int n) { int N=n,ans=0; while (N--) { if (tmp[now]>gold) { ans+=tmp[now]-gold; tmp[(now+1)%n]+=tmp[now]-gold; } else if (tmp[now]<gold) { ans+=gold-tmp[now]; tmp[(now+1)%n]-=gold-tmp[now]; } now=(now+1)%n; } return ans; } int cal(int s) { int res=0,flag1=0,flag2=0;; if (s%n==0) { flag1=1; int ans=0x3f3f3f3f; for (int i=0;i<n;i++) { for (int i=0;i<n;i++) tmp[i]=row[i]; ans=min(ans,change(i,s/n,n)); } res+=ans; } if (s%m==0) { flag2=1; int ans=0x3f3f3f3f; for (int i=0;i<m;i++) { for (int i=0;i<m;i++) tmp[i]=col[i]; ans=min(ans,change(i,s/m,m)); } res+=ans; } if (flag1==1 && flag2==1) printf("both %d\n",res); else if (flag1==1) printf("row %d\n",res); else if (flag2==1) printf("column %d\n",res); else printf("impossible\n"); } int main() { int t,cas=0; scanf("%d",&t); while (t--) { cas++; int sum=0; memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); scanf("%d%d",&n,&m); for (int i=0;i<n;i++) scanf("%s",&mp[i]); for (int i=0;i<n;i++) for (int j=0;j<m;j++) { if (mp[i][j]=='1') { row[i]++; col[j]++; sum++; } } printf("Case %d: ",cas); cal(sum); } }
相关文章推荐
- Android多媒体系统分析-Audio Framework 分析
- LeetCode(148) Sort List
- 文章标题
- Java枚举Enumeration接口
- 走迷宫
- 【POJ 2531】Network Saboteur
- Shell 的source命令
- [NOIP2006]金明的预算方案
- 目标检测的图像特征提取之(一)HOG特征
- hibernate中identity和increment区别
- 初步认识套接字编程(1)
- 百练 2767:简单密码
- sql删除数据库重复字段的行
- Yii2 小部件
- YEBIS
- 哪本书对程序员最有影响,每个程序员都该阅读的书
- Android开发教程 如何优化andriod布局
- 面试常备题---链表
- C++经典书籍
- 1006 zoj