Run Time: 0.013
Ranking (as of 2015-12-17): 126 out of 804
Language: C++
/* UVa 11205 - The broken pedometer To build using Visual Studio 2012: cl -EHsc -O2 UVa_11205_the_broken_pedometer.cpp */ #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; bool are_symbols_distinguishable(int mask, int mask_max, int nr_symbols, const vector<int>& symbols) { vector<bool> masked_symbols(mask_max, false); for (int i = 0; i < nr_symbols; i++) { int j = symbols[i] & mask; if (masked_symbols[j]) return false; masked_symbols[j] = true; } return true; } int count_leds(int i, int nr_leds) { int count = 0; for (int j = 0; j < nr_leds; j++, i >>= 1) if (i & 1) count++; return count; } int main() { int nr_problems; cin >> nr_problems; while (nr_problems--) { int nr_leds, nr_symbols; cin >> nr_leds >> nr_symbols; vector<int> symbols(nr_symbols); for (int i = 0; i < nr_symbols; i++) { int s = 0; for (int j = 0; j < nr_leds; j++) { char c; cin >> c; s <<= 1; if (c == '1') s |= 1; } symbols[i] = s; } int nr = nr_leds; if (!nr_symbols) nr = 0; else if (nr_symbols == 1) nr = 0; else { int min_nr_leds = static_cast<int>(ceil(log10(static_cast<double>(nr_symbols)) / log10(2.0))); // min. number of LEDs to distinguish the symbols for (int i = 1, i_max = static_cast<int>(pow(2.0, static_cast<double>(nr_leds))); i < i_max; i++) if (are_symbols_distinguishable(~i, i_max, nr_symbols, symbols)) { nr = min(nr, nr_leds - count_leds(i, nr_leds)); if (nr == min_nr_leds) break; } } cout << nr << endl; } return 0; }