洛谷1468 派对灯

一道非常妖路的题目,具体题目大概是说给四种按钮,分别可以让奇数偶数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值