jzoj 1262 为奶牛熄灯

Description

奶牛们喜欢在黑暗的环境里睡觉。当她们每晚回到牛棚准备睡觉时,牛棚里有L(3<=L<=50)盏灯仍然亮着。所有灯的开关按编号升序排成一列,最左边的那个开关控制1号灯(所谓控制,也就是如果1号灯现在亮着,那么按这个开关会使1号灯熄灭,否则这个操作会使1号灯被点亮)。由于奶牛们的蹄子过于粗大,没法方便地按开关,她们总是用一个特制的干草叉来进行对开关的操作。这个叉子设计了T(1<=T<=7)个叉尖,相邻叉尖的距离正好与相邻开关的距离相等。但是现在有些叉尖被折断了。比如说,T=4的一个干草叉,它的第3根叉尖被折断了,我们就用'1101'来描述它。
如果把这个叉子的最左端对准那一列开关的最左端,按下,那1号、2号和4号灯的状态会被改变(3号灯的状态不变,因为那个叉尖被折断了)。在进行这样的操作的时候,任何一个叉尖都必须有一个对应的开关,也就是说,叉子的边缘不能在那一列开关的范围外,即使边缘处的叉尖已经被折断。
现在,你已经知道了各个灯的状态,以及干草叉现在的情况,请你找出一个操作序列,使得在所有操作完成之后,仍然亮着的灯的数目最少。

Input

第1行: 两个用空格隔开的整数:L 和 T
第2行: 一个长度为L的字符串,串中不含空格且元素均为'0'或'1'。第i个元素是'1'则表示第i盏灯亮着,是'0'的话就表示第i盏灯已经被关掉
第3行: 一个长度为T的字符串,只含'0'或'1'(同样不含空格)。如果第i个元素是'1',说明干草叉的第i根叉尖仍完好无损,否则说明第i根叉尖已经被折断

Output

第1行: 输出一个正整数K,即为了达到目的一共需要用叉子按多少次开关

Sample Input

10 4
1111111111
1101

Sample Output

5 

Solutoin

由于叉子最多7个齿,而灯不超过50盏,所以可以使用状压DP。
f[i][j][k]表示前i盏灯,j盏亮着,k为后T-1盏的二进制状态。
从i到i+1时,可以选着叉或不叉。
t=k*2+a[i+1];
p=t^z;
t=p%(1<<(l-1));
f[i+1][j-h[k]+h[p]][t]=min(f[i+1][j-h[k]+h[p]][t],f[i][j][k]+1);
t=k*2+a[i+1];
t=t%(1<<(l-1));
f[i+1][j+a[i+1]][t]=min(f[i+1][j+a[i+1]][t],f[i][j][k]);
h[i]表示i二进制下1的个数

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

#define N 55
#define T 128
#define INF 0x7fffffff

int a[N],z=0;
int h[T];
int f[N][N][T];
int l,n,t,p;
int ans,s;
char c;

void pre()
{
    for (int i=0;i<T;++i)
    {
        int j=i;
        while (j!=0)
        {
            h[i]+=j%2;
            j=j/2;
        }
    }
}

void init()
{
    scanf("%d%d\n",&n,&l);
    for (int i=1;i<=n;++i)
    {
        c=getchar();
        if (c=='1') a[i]=1; 
          else a[i]=0;
    }
    scanf("\n");
    for (int i=l;i>=1;--i)
    {
        c=getchar();
        if (c=='1') t=1;
          else t=0;
        z+=t*(1<<(i-1));
    }
}

int main()
{
    freopen("xlite.in","r",stdin);
    freopen("xlite.out","w",stdout);
    pre();
    init();
    for (int i=0;i<=n;++i)
      for (int j=0;j<=n;++j)
        for (int k=0;k<=(1<<l)-1;++k)
          f[i][j][k]=INF/2;
    t=0; p=0;
    for (int i=1;i<=l-1;++i)
    {
      t+=a[i];
      p=p*2+a[i];
    }
    f[l-1][t][p]=0;
    for (int i=0;i<=n;++i)
      for (int j=0;j<=n;++j)
        for (int k=0;k<=(1<<(l-1))-1;++k)
          if (f[i][j][k]!=INF/2)
          {
            t=k*2+a[i+1];
            p=t^z;
            t=p%(1<<(l-1));
            //printf("p=%d t=%d\n",p,t);
            //printf("%d %d %d %d %d\n",i,j-h[k]+h[p],t);
            f[i+1][j-h[k]+h[p]][t]=min(f[i+1][j-h[k]+h[p]][t],f[i][j][k]+1);
            t=k*2+a[i+1];
            t=t%(1<<(l-1));
            f[i+1][j+a[i+1]][t]=min(f[i+1][j+a[i+1]][t],f[i][j][k]);
          }
    s=n;
    ans=INF/2;
    for (int i=0;i<=n;++i)
      for (int j=0;j<=(1<<(l-1))-1;++j)
          if (f[n][i][j]!=INF)
              if (i<=s && f[n][i][j]<ans)
                {
                    s=i;
                    ans=f[n][i][j];
                }
                else if (i>s) break;
    printf("%d\n",ans);
    return 0;
}   
ThingsBoard是一个物联网平台,用于监控和管理各种设备和传感器。奶牛不显示位置可能是由以下几个原因导致的: 1. 设备连接问题:奶牛可能没有正确连接到物联网平台。可能是因为设备故障、网络问题或设置错误的设备凭据。在这种情况下,需要检查设备连接设置并确保设备能够正确连接到物联网平台。 2. 传感器故障:奶牛位置的显示可能依赖于GPS或其他类型的传感器。如果这些传感器出现故障或损坏,那么奶牛位置将无法正确显示。在这种情况下,需要检查传感器并确保其正常工作。 3. 数据传输问题:奶牛位置的显示可能涉及到数据的上传和传输。如果数据上传或传输过程中出现问题,那么奶牛位置将无法正确显示。这可能是由于网络问题、数据格式错误或传输设置错误等原因导致的。在这种情况下,需要检查数据传输的设置和配置,并确保数据能够成功传输到物联网平台。 4. 平台设置问题:有可能是物联网平台的设置问题导致奶牛位置无法显示。可能是因为位置显示功能未启用、权限设置问题或其他平台配置错误导致的。在这种情况下,需要检查物联网平台的相关设置,并确保位置显示功能已启用。 需要仔细检查这些方面,并排除可能的问题,以便修复奶牛位置无法显示的问题。在解决问题之前,最好与物联网平台的技术支持团队联系,获得专业的帮助和指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值