子集枚举,很黄很暴力 /* coder: ACboy date: 2010-3-18 result: AC description: UVa 11205 The broken pedometer */ #include <iostream> using namespace std; char data[110][20]; char temp[110][20]; int a[40000][20]; int c = 0; void print_subset(int n, int s) { for (int i = 0; i < n; ++i) { if (s & (1<<i)) a[c][i] = 1; else a[c][i] = 0; } c++; } void findAllSubset(int n) { for (int i = 0; i < (1<<n); ++i) { print_subset(n, i); } } int cmp(const void * a, const void * b) { char * pa = (char *)a; char * pb = (char *)b; return strcmp(pa, pb); } int findAns(int pos, int n, int p) { int t = 0; for (int i = 0; i < p; ++i) { if (a[pos][i] == 1) t++; else { for (int j = 0; j < n; ++j) { temp[j][i] = '0'; } } } qsort(temp, n, sizeof(char [20]), cmp); int flag = 1; for (int k = 0; k < n - 1; ++k) { if (strcmp(temp[k], temp[k + 1]) == 0) { flag = 0; break; } } if (flag) { return t; } else { return 20; } } int main() { int n; #ifndef ONLINE_JUDGE freopen("11205.txt", "r", stdin); #endif cin >> n; while (n--) { int P, N; cin >> P >> N; int i, j; for (i = 0; i < N; ++i) { for (j = 0; j < P; ++j) { cin >> data[i][j]; } data[i][j] = '/0'; } c = 0; findAllSubset(P); int ans = P; for (i = 0; i < c; i++) { memcpy(temp, data, sizeof(data)); int k = findAns(i, N, P); if (k < ans) { ans = k; } } cout << ans << endl; } return 0; }