JOI2008予選 問題5@C++(7)
ビット演算の基本さえ知っていれば簡単。
#include <cstdio> #include <algorithm> #include <vector> using namespace std; int main(int argc,char* argv[]) { int r,c; scanf("%d %d",&r,&c); vector<int> nums(c); for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { int current; scanf("%d",¤t); nums[j]+=current<<i; } } vector<int> bintocount(1<<r); for(int i=0;i<(1<<r);i++) { int count=0; for(int j=0;j<r;j++) { if(i&(1<<j))count++; } bintocount[i]=max(count,r-count); } int max_sum=0; for(int i=0;i<(1<<r);i++) { int sum=0; for(int j=0;j<c;j++) { sum+=bintocount[i^nums[j]]; } max_sum=max(max_sum,sum); } printf("%d\n",max_sum); return 0; }