一道非常妖路的题目,具体题目大概是说给四种按钮,分别可以让奇数偶数K*3+1或者亮的灭 灭的亮…给出操作限制数目,给出最后灯的一些情况限制,求哪几种方案是合法的。 这题的结论分析可以写很多,首先 每个灯至多按一次,多按了也没用 按1次=按3次 按2次等于没按。 其次我们会发现在这样的情况下,最多只有8种按法 包括但不限于 按1 按2 按 3 按 4 按 1+4 按2+4 按 3+4 不去按…等等。 那么我们可以发现,这些操作最后就1-2次就可以完成,但是我们怎么去凑那个C? 解法也是很牛逼,因为按1和按2结合以后就等于按3,所以其实这些都可以被凑出来…比如按1那个情况是合法的 但是要操作两次 咋办? 那就直接按2+3就完事了。
只能说是个神仙题目,给想出来的大佬跪下了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int state[9][7]{
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,1,1,1,0},
{0,0,1,0,1,0,1},
{0,0,1,1,0,1,1},
{0,1,0,0,1,0,0},
{0,1,0,1,0,1,0},
{0,1,1,0,0,0,1},
{0,1,1,1,1,1,1},
};
int C, N, x, a[8];
int minn[9]={0,1,2,1,3,2,1,2};
bool flag=0;
int main()
{
int i, j, k;
for(i=1;i<=6;i++)
{
a[i]=-1;
}
cin>>N>>C;
while(cin>>x,x!=-1)
{
int v=x%6;
if(v==0)
v=6;
a[v]=1;
}
while(cin>>x,x!=-1)
{
int v=x%6;
if(v==0)
v=6;
a[v]=0;
}
for(i=1;i<=8;i++)
{
int f=1;
for(j=1;j<=6;j++)
{
if(a[j]==-1)
continue;
if(a[j]!=state[i][j])
{
f=0;
break;
}
}
if(f==1&&(C>=minn[i]||(C==1&&i==4)))
{
for(int j=1;j<=N;j++)
{
int v=j%6;
if(v==0)
v=6;
cout<<state[i][v];
flag=1;
}
cout<<endl;
}
}
if(!flag)
cout<<"IMPOSSIBLE"<<endl;
}