zoukankan      html  css  js  c++  java
  • Flashing Fluorescents(状压DP)

    Flashing Fluorescents

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 56  解决: 19
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    You have n lights, each with its own button, in a line. Pressing a light’s button will toggle that light’s state; if the light is on, it will turn off, and if the light is off, it will turn on. The lights change at 1 second timesteps. You can press a button at any time, but it will not take effect until the next timestep. Before each timestep, you may choose to push at most one button (you may also choose to not press any button).
    Pushing a button will affect not just the light in question, but all lights down the line. More specifically, if you choose to press the ith button right before the kth timestep, then the (i + m)th light will toggle on the (k + m)th timestep (with i + m ≤ n). For example, if you press button 5 just before time 19, then light 5 will toggle at time 19, light 6 will toggle at time 20, light 7 will toggle at time 21, and so on. If you push a button that will take effect at the same time as its light would have toggled due to an earlier button press, then the two cancel each other out, including subsequent toggles.
    Suppose there are three lights, all of which are off at the start. If you press the first button before the first timestep, this will happen in three timesteps:
    Now, suppose you press the first button before the first timestep, and then the second button between the first and second timesteps. The button press will cancel out the propagation, and this will happen (note that the propagation will go no further):
    Now, suppose you press the first button before the first timestep, and then the third button between the first and second timesteps. All three lights will be on at the second timestep (but not the third):
    You wish to turn on all the lights. What is the earliest time you could possibly see all of the lights turned on? Note that if the lights are all on at time t but not at time t + 1 due to this propagation, t is still the correct answer.

    输入

    Each input will consist of a single test case. Note that your program may be run multiple times on different inputs. Each test case will consist of a single string S (1 ≤ |S| ≤ 16). The string S will contain only the characters 1 and 0, where 1 represents that that light is initially on, and 0 represents that that light is initially off. The first character is light 1, the next is light 2, and so on.

    输出

    Output a single integer, which is the earliest time at which all of the lights are on.

    样例输入

    1101
    

    样例输出

    1
    

     思路:从1开始枚举答案,遍历已经存在的状态,同时加入新的状态,直到所有灯泡变亮,即now=0.

    AC代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn=(1<<18);
     5 string s;
     6 int n,vis[maxn];
     7 ll cnt,val;
     8 vector<int> v;
     9 int main()
    10 {
    11     cin>>s;
    12     n=s.size();
    13     for(int i=0;i<n;i++)
    14     {
    15         if(s[i]=='0') val+=(1ll<<i);
    16     }
    17     if(val==0)
    18     {
    19         cout<<"0"<<endl;
    20         return 0;
    21     }
    22     vis[val]=1;
    23     cnt=(1<<n)-1;
    24     v.push_back(val);
    25     for(int ans=1;;ans++)
    26     {
    27         ll len=v.size();
    28         ll sec=(1<<ans)-1;
    29         for(int i=0;i<len;i++)
    30         {
    31             ll tmp=v[i];
    32             for(int j=0;j<=n;j++)
    33             {
    34                 ll now=cnt&(tmp^(sec<<j));
    35                 if(vis[now]==0)
    36                 {
    37                     vis[now]=1;
    38                     if(now==0)
    39                     {
    40                         cout<<ans<<endl;
    41                         return 0;
    42                     }
    43                     v.push_back(now);
    44                 }
    45             }
    46         }
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    通过PROFINET网络实现SINAMICS 120的PN IO OPC通讯,起动及调速控制
    Python datetime获取当前年月日时分秒
    计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信
    Ubuntu16.04安装、卸载宝塔软件
    Ubuntu一键安装LAMP,LNMP
    STM32使用K型热电偶测温:运算放大器+内置ADC+K型热电偶分度表+中间温度定律 | K型热电偶的温度-热电势曲线
    盘点几种DIY加密狗的制作方法,适用于穿越机模拟器
    变频器通讯参数PKW和PZD的含义
    穿越机从0到起飞:选件
    西门子S7-1200PLC不让下载一直报“模块具有激活的测试和调试功能,防止下载到设备”解决方法
  • 原文地址:https://www.cnblogs.com/lglh/p/9557419.html
Copyright © 2011-2022 走看看