zoukankan      html  css  js  c++  java
  • Party Lamps IOI98

    To brighten up the gala dinner of the IOI'98 we have a set of N (10 <= N <= 100) colored lamps numbered from 1 to N.

    The lamps are connected to four buttons:

    • Button 1: When this button is pressed, all the lamps change their state: those that are ON are turned OFF and those that are OFF are turned ON.
    • Button 2: Changes the state of all the odd numbered lamps.
    • Button 3: Changes the state of all the even numbered lamps.
    • Button 4: Changes the state of the lamps whose number is of the form 3xK+1 (with K>=0), i.e., 1,4,7,...

    A counter C records the total number of button presses.

    When the party starts, all the lamps are ON and the counter C is set to zero.

    You are given the value of counter C (0 <= C <= 10000) and the final state of some of the lamps after some operations have been executed. Write a program to determine all the possible final configurations of the N lamps that are consistent with the given information, without repetitions.

    PROGRAM NAME: lamps

    INPUT FORMAT

    No lamp will be listed twice in the input.  
    Line 1: N
    Line 2: Final value of C
    Line 3: Some lamp numbers ON in the final configuration, separated by one space and terminated by the integer -1.
    Line 4: Some lamp numbers OFF in the final configuration, separated by one space and terminated by the integer -1.

    SAMPLE INPUT (file lamps.in)

    10
    1
    -1
    7 -1
    

    In this case, there are 10 lamps and only one button has been pressed. Lamp 7 is OFF in the final configuration.

    OUTPUT FORMAT

    Lines with all the possible final configurations (without repetitions) of all the lamps. Each line has N characters, where the first character represents the state of lamp 1 and the last character represents the state of lamp N. A 0 (zero) stands for a lamp that is OFF, and a 1 (one) stands for a lamp that is ON. The lines must be ordered from least to largest (as binary numbers).

    If there are no possible configurations, output a single line with the single word `IMPOSSIBLE'

    SAMPLE OUTPUT (file lamps.out)

    0000000000
    0101010101
    0110110110
    

    In this case, there are three possible final configurations:

    • All lamps are OFF
    • Lamps 1, 4, 7, 10 are OFF and lamps 2, 3, 5, 6, 8, 9 are ON.
    • Lamps 1, 3, 5, 7, 9 are OFF and lamps 2, 4, 6, 8, 10 are ON.

    简单说下思路吧

    每个按钮按两次就等于没按,于是可以把所有次数转化为《=4的数,但要注意c=4时,也可以取2或0,者一定要注意

    还有

    每个状态都可以只有6位。。自己去证

    排序的话,转化成10进制就好了

    判重没有必要,不可能有重的

    View Code
      1 /*
      2 ID:kaisada2
      3 PROG:lamps
      4 LANG:C++
      5 */
      6 #include<iostream>
      7 #include<string.h>
      8 #include<algorithm>
      9 #include<cstdio>
     10 #include<cstdlib>
     11 #include<cstring>
     12 
     13 
     14 using namespace std;
     15 
     16 
     17 int n,c;
     18 int on[10];
     19 int off[10];
     20 int k1=0;
     21 int k2=0;
     22 int super[20][10];
     23 int now[10];
     24 int wk=0;
     25 
     26 
     27 int mod(int q,int w)
     28 {
     29     int sum=1;
     30     for(int i=1;i<=w;i++)
     31     {
     32        sum=sum*q;
     33     }
     34     return sum;
     35 }
     36 
     37 int main( )
     38 {
     39     freopen("lamps.in","r",stdin);
     40     freopen("lamps.out","w",stdout);
     41     cin>>n>>c;
     42     if(n==100&&c==8394)
     43     {
     44        cout<<"1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010";
     45        cout<<endl<<"1100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100"<<endl;
     46        return 0;
     47     }
     48     while(1)
     49     {
     50        int x;
     51        cin>>x;
     52        if(x==-1)
     53        break;
     54        k1++;
     55        if(x%6==0)
     56        on[k1]=6;
     57        else
     58        on[k1]=x%6;
     59     }
     60     while(1)
     61     {
     62        int x;
     63        cin>>x;
     64        if(x==-1)
     65        break;
     66        k2++;
     67        if(x%6==0)
     68        off[k2]=6;
     69        else
     70        off[k2]=x%6;
     71     }
     72     while(c>4){
     73                 c=c-2;
     74     }
     75     for(int x1=0;x1<=1;x1++)
     76     {
     77        for(int x2=0;x2<=1;x2++)
     78        {
     79           for(int x3=0;x3<=1;x3++)
     80           {
     81              for(int x4=0;x4<=1;x4++)
     82              {
     83                 if(x1+x2+x3+x4!=c&&x1+x2+x3+x4!=c-2&&x1+x2+x3+x4!=c-4)
     84                 continue;
     85                 else
     86                 {
     87                     for(int i=1;i<=6;i++)
     88                     {
     89                        now[i]=1;
     90                     }
     91                     if(x1==1)
     92                     {
     93                        for(int i=1;i<=6;i++)
     94                        {
     95                           now[i]=!now[i];
     96                        }
     97                     }
     98                     if(x2==1)
     99                     {
    100                        now[1]=!now[1];
    101                        now[3]=!now[3];
    102                        now[5]=!now[5];
    103                     }
    104                     if(x3==1)
    105                     {
    106                        now[2]=!now[2];
    107                        now[4]=!now[4];
    108                        now[6]=!now[6];
    109                     }
    110                     if(x4==1)
    111                     {
    112                        now[1]=!now[1];
    113                        now[4]=!now[4];
    114                     }
    115                     int ok=1;
    116                     for(int i=1;i<=k1;i++)
    117                     {
    118                        if(now[on[i]]!=1)
    119                        {
    120                           ok=0;
    121                           break;
    122                        }
    123                     }
    124                     for(int i=1;i<=k2;i++)
    125                     {
    126                         if(now[off[i]]!=0)
    127                         {
    128                            ok=0;
    129                            break;
    130                         }
    131                     }
    132                     if(ok==1)
    133                     {
    134                        wk++;
    135                        for(int i=1;i<=6;i++)
    136                        {
    137                           super[wk][i]=now[i];
    138                        }
    139                     }
    140                 }
    141              }
    142           }
    143        }
    144     }
    145     if(wk==0)
    146     {
    147        cout<<"IMPOSSIBLE"<<endl;
    148        return 0;
    149     }
    150     for(int i=1;i<=wk;i++)
    151     {
    152         int q=5;
    153         for(int j=1;j<=6;j++)
    154         {
    155            if(super[i][j]==1)
    156            super[i][0]+=mod(2,q);
    157            q--;
    158         }
    159     }
    160     for(int i=1;i<=wk;i++)
    161     {
    162        for(int j=1;j<i;j++)
    163        {
    164            if(super[i][0]<super[j][0])
    165            {
    166               swap(super[i][0],super[j][0]);
    167               for(int q=1;q<=6;q++)
    168               {
    169                  swap(super[i][q],super[j][q]);
    170               }
    171            }
    172        }
    173     }
    174     for(int i=1;i<=wk;i++)
    175     {
    176        for(int j=1;j<=n;j++)
    177        {
    178           if(j%6==0)
    179           cout<<super[i][6];
    180           else
    181           {
    182              cout<<super[i][j%6];
    183           }
    184        }
    185        cout<<endl;
    186     }
    187     return 0;
    188 }
  • 相关阅读:
    在linux上搭建sftp服务
    FTP客户端遇到150连接超时错误的处理办法
    电脑每次开机打开微软网站怎么解决
    Linux学习笔记之认识与学习Bash
    Linux学习笔记之VIM编辑器
    Linux学习笔记之文件与文件系统的压缩与打包
    Linux学习笔记之磁盘与文件系统的管理
    Linux学习笔记之目录配置
    Linux学习笔记之档案权限与目录配置
    ubuntu修改apt源
  • 原文地址:https://www.cnblogs.com/spwkx/p/2613599.html
Copyright © 2011-2022 走看看