命运之手
Problem A. 命运之手(fate.c/cpp/pas)
发牌者的憎恶
|
Input file |
fate.in |
|
Output file |
fate.out |
|
Time limit |
1 sec |
|
Memory limit |
128 mb |
Liang同学最近被日天同学带的迷上了玩命运之手,然后天天和BUFF同学说什么什么命运之手什么什么的,穷的没钱买的BUFF同学烦了,于是给他加了个BUFF,“发牌者的憎恶”,于是在Liang同学今天晚上的命运之手游戏中,发牌者就给Liang同学出了个难题,N(N<=100000)行牌,一共有8列,一开始牌有正面朝上和反面朝上的,发牌人会下给Liang同学和正面牌数相同的诅咒,当然Liang知道诅咒的恶心,于是就想让牌尽量少的朝上,Liang同学每次可以翻一行或一列的牌,可以翻无数次,请告诉Liang同学,他最少被诅咒多少次,即Liang同学翻过后牌尽量少的朝上数。
Input
数据第一行为整数 n不超过 100000;第二~n+1行为 n*8的0,1矩阵,0为反面朝上的牌,1为正面朝上的牌。(最好搞个读入优化)
Output
对于每组数据,输出请告诉Liang同学,他最少被诅咒多少次
。
Examples
|
fate.in |
fate.out |
|
2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
|
0 |
Hint
对于 50%的数据,0<= n <= 1000
对于 80%的数据,0<= n <= 50000
对于 100%的数据,0 <= n <= 100000
枚举+贪心
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=100005; 8 int A[maxn][9]; 9 bool vis[9]; 10 int N,ans=1e8; 11 12 void dfs(int i) 13 { 14 if(i>8) 15 { 16 for(int j=1;j<=8;++j) 17 if(vis[j]) 18 { 19 for(int k=1;k<=N;++k) 20 A[k][j]=1-A[k][j]; 21 } 22 int sum=0; 23 for(int j=1;j<=N;++j) 24 { 25 int cnt=0; 26 for(int k=1;k<=8;++k) 27 cnt+=A[j][k]; 28 if(cnt>4) sum+=8-cnt; 29 else sum+=cnt; 30 } 31 // cout<<sum<<endl; 32 ans=min(ans,sum); 33 for(int j=1;j<=8;++j) 34 if(vis[j]) 35 { 36 for(int k=1;k<=N;++k) 37 A[k][j]=1-A[k][j]; 38 } 39 return; 40 } 41 dfs(i+1); 42 vis[i]=true; 43 dfs(i+1); 44 vis[i]=false; 45 } 46 47 int main() 48 { 49 #ifndef ONLINE_JUDGE 50 freopen("fate.in","r",stdin); 51 freopen("fate.out","w",stdout); 52 #endif 53 scanf("%d\n",&N); 54 memset(vis,false,sizeof(vis)); 55 for(int i=1;i<=N;i++) 56 { 57 for(int j=1;j<=8;++j) 58 { 59 A[i][j]=getchar()-'0'; 60 getchar(); 61 } 62 } 63 dfs(1); 64 cout<<ans; 65 return 0; 66 }

浙公网安备 33010602011771号