• usaco 2.2.4 生日派对灯(最近写题碰到的,虽然知道现在写这个有点晚了)


    经过分析,他看似很多的开灯的方法其实合并起来就只有八个。

    首先,一个开关在执行的时候只能按一次(因为你就算按了两次就相当于一次也没有按)。

    当一个都不按的时候  当然就只有一种:不按。

    当按一下的时候:很明显(1)(2)(3)(4)四种。

    当按两下的时候:(1,2)(1,3)(1,4)(2,3)(2,4)(3,4)。 然而(1,2)就相当于是3;(1,3)=2;(2,3)=1;所以按两下的就只有(1,4)(2,4)(3,4)。

    当按三下的时候:(1,2,3)(1,2,4)(1,3,4)(2,3,4)....。然而都可以相当于 空(3,4)(2,4)(1,4)也就是什么都没有了 QWQ;

    按四下:应该就可以发现其实也是能和前面的合并;

    所以所有的策略中就只有8中了:空 (1)(2)(3)(4)(1,4)(2,4)(3,4)。

    这就已经把按灯的套路合并完了。

    -----------------------------接下来是计数器c的情况的分析----------------------------------------------------

    当c==0的时候,很明显:不按。

    当c==1的时候,也很明显:(1)(2)(3)(4) 四种。

    当c==2的时候,就有七种情况了:(1)[按2和3合并为1((2)(3)的情况一样)](2)(3)(1,4)(2,4)(3,4)不按(这里没有(4),因为无论如何按两下都不可能把(4)给按出来)。

    当c==3的时候,所有情况都可以了(你问我为什么??像第二步一样了)。

    所以这道题很容易的就搞定了。

    复制代码
    #include<iostream>
    #include<cstdio>
    #include<ctime>
    #include<algorithm>
    using namespace std;
    int n,c,x;
    int a[150],b[150],d[150];
    long long q[150];
    int t=0;
    void init()
    {
        cin>>n>>c;
        while((cin>>x)&&(x!=-1))
            a[x]=1;
        while((cin>>x)&&(x!=-1))
            b[x]=1;
    }
    void haha()
    {
        for(int i=1;i<=n;i++)
            d[i]=1;
    }
    bool check()
    {
        for(int i=1;i<=n;i++)
        {
            if((a[i])&&(!d[i])) return 0;
            if((b[i])&&(d[i]))  return 0;
        }
        return 1;
    }
    void print()
    {
        for(int i=1;i<=n;i++)
            cout<<d[i];
        cout<<endl; t++;
    }
    void doit1()
    {
        for(int i=1;i<=n;i++)
            d[i]=(d[i])?0:1;
    }
    void doit2()
    {
        for(int i=1;i<=n;i+=2)
            d[i]=(d[i])?0:1;
    }
    void doit3()
    {
        for(int i=2;i<=n;i+=2)
            d[i]=(d[i])?0:1;
    }
    void doit4()
    {
        for(int i=1;i<=n;i+=3)
            d[i]=(d[i])?0:1;
    }
    int main()
    {
            freopen("add.in","r",stdin);
        freopen("add.out","w",stdout);
        init();
        haha();
        switch(c)
        {
            case 0:
                if(check()) print();
                break;
            case 1:
                haha(); doit1();
                if(check()) print();
                haha(); doit2();
                if(check()) print();
                haha(); doit3();
                if(check()) print();
                haha(); doit4();
                if(check()) print();
                break;
            case 2:
                haha(); doit1();
                if(check()) print();
                haha(); doit3(); doit4();
                if(check()) print();
                haha(); doit2();
                if(check()) print();
                haha(); doit1(); doit4();
                if(check()) print();
                haha(); doit3();
                if(check()) print();
                haha(); doit2(); doit4();
                if(check()) print();
                haha();
                if(check()) print();
                break;
            default:
                haha(); doit1();
                if(check()) print();
                haha(); doit3(); doit4();
                if(check()) print();
                haha(); doit2();
                if(check()) print();
                haha();doit4();
                if(check()) print();
                haha(); doit1(); doit4();
                if(check()) print();
                haha(); doit3();
                if(check()) print();
                haha(); doit2(); doit4();
                if(check()) print();
                haha();
                if(check()) print();
                break;
        }
        if(t==0){ 
            cout<<"IMPOSSIBLE"<<endl;
        }
        return 0;
    }
        
  • 相关阅读:
    PostgreSQL杂记页
    程序员给女朋友周年纪念的浪漫
    实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件
    XAOP的使用示范例子
    XPage的使用示范例子
    Python手势识别与控制
    Python人体肤色检测
    基于Opencv自带BP网络的车标简易识别
    iOS 自定义转场动画
    Python实时语音识别控制
  • 原文地址:https://www.cnblogs.com/assassinyyd/p/6048895.html
Copyright © 2020-2023  润新知