翻硬币

来源:互联网 发布:哈工程教务处网络选课 编辑:程序博客网 时间: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;}


原创粉丝点击