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;
}
    
时间: 2024-10-01 02:35:43

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

【USACO 2.2.4】派对灯

[描述] 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮. 按钮2:当按下此按钮,将改变所有奇数号的灯. 按钮3:当按下此按钮,将改变所有偶数号的灯. 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯.例如:1,4,7... 一个计数器C记录按钮被按下的次数.当宴会开始,所有的灯都亮着,此时计数器C为0. 你将得到计数

USACO 2.2 Party Lamps 派对灯 (lamps)

题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮. 按钮2:当按下此按钮,将改变所有奇数号的灯. 按钮3:当按下此按钮,将改变所有偶数号的灯. 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯.例如:1,4,7... 一个计数器C记录按钮被按下的次数.当宴会开始,所有的灯都亮着,此时计数器C为0.你将得到计数器C

英国儿童生日派对攀比风

近两年,英国儿童的生日派对愈发隆重和昂贵,甚至成为一种逃不掉的负担.家长们简直有些吃不消,开始怨声载道了.http://www.ximalaya.com/zhubo/27465564/ http://www.ximalaya.com/zhubo/27465582/ http://www.ximalaya.com/zhubo/27465600/ http://www.ximalaya.com/zhubo/27465619/ http://www.ximalaya.com/zhubo/2746562

洛谷 P1468 [USACO2.2]派对灯 Party Lamps

题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮. 按钮2:当按下此按钮,将改变所有奇数号的灯. 按钮3:当按下此按钮,将改变所有偶数号的灯. 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯.例如:1,4,7... 一个计数器C记录按钮被按下的次数.当宴会开始,所有的灯都亮着,此时计数器C为0. 你将得到计数

luogu P1468 派对灯 Party Lamps

题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮. 按钮2:当按下此按钮,将改变所有奇数号的灯. 按钮3:当按下此按钮,将改变所有偶数号的灯. 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯.例如:1,4,7... 一个计数器C记录按钮被按下的次数.当宴会开始,所有的灯都亮着,此时计数器C为0. 你将得到计数

2.2.4 PARTY LAMPS 派对灯

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2328 题目大意:(如题) 输入输出:(如题) 解题思路: 1.因为每个按钮按2次和没按效果是一样的.所以每个按钮或者按或者不按,一共有2^4=16中状态. 2.然后因为这个电灯系统有个性质,每6个一循环,所以把这4个按钮的16种状态对应的前6个灯的状态枚举出来.然后分析,发现一下规律: -按1和按2相当于按3: -按2和按3相当于按1: -按1和按3相当于按2: -按1按2和按3相当于不按:

hdu 1520 Anniversary party 生日party 树形dp第一题

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8667    Accepted Submission(s): 3748 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the

[DP][数学]JZOJ 3318 Brunhilda的生日

Description 除去对铁质盔甲强烈的热爱,Brunhilda是一个正常的7岁女孩.近期,她正在策划一个完美的生日派对.她发明了如下的一个游戏:所有的孩子在一个数k被宣读之前不停地跑来跑去.当这个数字k宣读后,所有的孩子将形成人数恰好为k的若干群体,且保证剩余的孩子数目小于k.最后,这不足k个的孩子将从游戏中被淘汰.紧接着,比赛将继续进行,并公布一个新的数字k.游戏将在所有的孩子都被淘汰后结束. Brunhilda请她的父亲Wotan在游戏中来宣读数字.Wotan不喜欢这个游戏,当然也不希

[IOI1996] USACO Section 5.3 Network of Schools(强连通分量)

nocow上的题解很好. http://www.nocow.cn/index.php/USACO/schlnet 如何求强连通分量呢?对于此题,可以直接先用floyd,然后再判断. ---------------------------------------------------------------------------------- #include<cstdio> #include<iostream> #include<algorithm> #includ