翻硬币
来源:互联网 发布:哈工程教务处网络选课 编辑:程序博客网 时间:2024/04/30 07:03
考虑一个翻硬币游戏。有N(N<=10000)行硬币,每行9个,排成一个N*9的方阵,有的正面朝上有的反面朝上。我们每次把一整行或者一整列的所有硬币翻过来,请问怎么翻,使得正面朝上的硬币尽量多。输入 第一行:整数N(表示有N行) 第二~N行:每行9个整数(0或1,分别对应反面和正面,用空格隔开)输出 一个整数,表示最多可使多少硬币正面朝上.样例输入101 1 1 1 1 1 1 1 01 1 0 0 0 1 0 1 00 0 1 1 1 0 1 0 11 0 0 0 1 0 0 1 11 0 1 1 1 0 1 1 01 1 1 0 1 1 1 0 11 1 1 0 0 0 0 0 11 0 0 1 0 0 0 1 01 0 1 0 1 1 1 0 01 0 1 1 0 0 1 1 1样例输出63
此题只是通过这个测试例子和自己列举一些例子测试,没有放到oj测试。没有找到oj有这个题目的。
解法:纯粹枚举。硬币翻两次等于不翻,所以所有行/列最多翻一次。枚举每列是否翻有2^9=512种情况,此时可以用O(n)的时间计算每行是否翻(注意:列确定以后每行独立)。
#include<iostream>#include<fstream>using namespace std;int a,b,c,d,e,f,g,h,k,n;int cone[10000][9];void change(int y){ for(int i=0;i<n;++i) if(cone[i][y]==1) cone[i][y]=0; else cone[i][y]=1;}void ccc(){ if(a==1) change(0); if(b==1) change(1); if(c==1) change(2); if(d==1) change(3); if(e==1) change(4); if(f==1) change(5); if(g==1) change(6); if(h==1) change(7); if(k==1) change(8);}int main(){ //fstream cin("d:\\test.txt"); int i,j,front,back,MAX=0,x; cin>>n; for(i=0;i<n;i++) for(j=0;j<9;j++) { cin>>x; cone[i][j]=x; } for(a=0;a<2;++a)//枚举列512情况 for(b=0;b<2;++b) for(c=0;c<2;++c) for(d=0;d<2;++d) for(e=0;e<2;++e) for(f=0;f<2;++f) for(g=0;g<2;++g) for(h=0;h<2;++h) for(k=0;k<2;++k) { ccc(); for(i=0;i<n;i++)//处理每一行 { back=0; front=0; for(j=0;j<9;j++) if(cone[i][j]==0) back++; front=9-back; if(back>front) for(j=0;j<9;j++) if(cone[i][j]==1) cone[i][j]=0; else cone[i][j]=1; } int cnt=0; for(i=0;i<n;i++) for(j=0;j<9;j++) if(cone[i][j]==1) cnt++; if(cnt>MAX) MAX=cnt; ccc();//恢复现场 } cout<<MAX<<endl; return 0;}
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- 翻硬币
- Fedora14 Samba 配置
- 编译c++ demo
- java获取网页
- IE10 下CSS3选择器及动画(animation)效果实例教程
- 杭电2043
- 翻硬币
- JAVA 在 ACM 中的使用
- UCCX客户端XP系统中报错:java.lang.NullPointerException
- OpenCV2 直方图均衡化
- 图像处理之泛洪填充算法(Flood Fill Algorithm)
- Eclipse上GIT插件EGIT使用手册
- Flex4之Tree开发【一】
- 开发者需知的10类工具
- 教你如何迅速秒杀掉:99%的海量数据处理面试题