UVA 11205 The broken pedometer

来源:互联网 发布:gif压缩 知乎 编辑:程序博客网 时间:2024/05/16 02:17

UVA 11205 The broken pedometer

题目大意:给出几行数字组合,求出至少取几列可以分辨出不同行

解题思路:刚刚开始学子集生成,方法比较笨,位向量法生成子集,去二进制数,然后排序,求相邻的数是否都不相同

#include <stdio.h>#include <iostream>#include <string.h>#include <math.h>using namespace std;int m, l;int num[100][100];int num2[100];int com[100];int mi;int cmd(const void *a, const void *b) {    return *(int*)a - *(int*)b;}void sol(int a, int b) {    if(m == 1) {        mi = 0;        return;    }    if(a == l && b == 0)        return;    if(a == l) {        memset(com, 0, sizeof(com));        for(int i = 0; i < l; i++)            if(num2[i] == 1) {                for(int j = 0; j < m; j++)                    com[j] = com[j] + num[j][i] * pow(2, i);            }        qsort(com, m, sizeof(int), cmd);        for(int i = 1; i < m; i++) {            if(com[i] == com[i-1])                return;        }        if(b  < mi)            mi = b;        return;    }    num2[a] = 0;    sol(a+1, b);    num2[a] = 1;    sol(a+1, b+1);}int main() {    int n;    cin >> n;    while(n--) {        memset(num, 0, sizeof(num));        memset(num2, 0, sizeof(num2));        cin >> l;        cin >> m;        for(int i = 0; i < m; i++) {            for(int j = 0; j < l; j++)                cin >> num[i][j];        }        mi = l;        sol(0, 0);        cout << mi << endl;    }    return 0;}
0 0