UVA 11205 - The broken pedometer 暴力 二进制表示状态

来源:互联网 发布:淘宝被买家诈骗怎么办 编辑:程序博客网 时间:2024/05/16 14:39
用最少的LED灯区分 给出来的数字   LED灯最多15个   而数字最多100个以最大来讨论   每个LED灯的状态有两种  开或关    所以自然而然的就用0 1 来表示LED灯的状态最多15个灯  2的15次方    最多100组需要判断的   暴力不会超时   需要注意的是  在每次循环判断完后  vis数组需要清零   但是不能全部清零

那样会超时   2的30次方必超时    因为每次改变的vis不超过100个  所以把这一百个记录下来 最后把这些清零就OK了

那样会超时   2的30次方必超时    因为每次改变的vis不超过100个  所以把这一百个记录下来 最后把这些清零就OK了

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;int main(){    #ifdef LOCAL    freopen("in.txt","r",stdin);    #endif // LOCAL    int T,n[15];    scanf("%d",&T);    n[0] = 1;    for(int x = 1;x <= 15; x++)        n[x] = n[x-1] * 2;    while(T--)    {        int P,N,s;        scanf("%d%d",&P,&N);        int LED[105],vis[65540],a[105];        memset(LED,0,sizeof(LED));        memset(vis,0,sizeof(vis));        for(int i = 1; i <= N; i++)        {            for(int j = P-1; j >= 0; j--)            {                scanf("%d",&s);                LED[i] += s * n[j];            }        }        int minn = 20;        for(int i = 1; i <= pow(2,P); i++)        {            int cnt = 0,k = i,ok = 1,M = N;            while(k)            {                cnt += k % 2;                k /= 2;            }            if(cnt > minn)continue;            for(int j = 1; j <= N; j++)            {                a[j] = LED[j] & i;                if(vis[a[j]]){ok = 0;M = j;break;}                vis[a[j]] = 1;            }            for(int t = 1; t <= M; t++)                vis[a[t]] = 0;            if(ok)                minn = min(minn,cnt);        }        printf("%d\n",minn);    }    return 0;}


0 0
原创粉丝点击