1 条题解

  • 0
    @ 2026-8-30 1:17:34

    考点其实比较老套了

    因为任意一个按键按偶数次就等于没按

    所以4个forfor枚举每个开关按还是不按

    判断一下枚举的按的次数是否和c的奇偶性相同

    相同的话就简单了,因为起始都开灯,模拟就是了

    然后和题目给的状态对比,可行就存下来

    当然我写的是比较好看的(除了没有加空格)

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=109;
    int n,c;
    int a[maxn],b[maxn],top;
    string f[maxn];
    void run()
    {
    	string temp="";
    	for(int i=1;i<=n;i++)	temp+=char(b[i]+'0');
    	f[++top]=temp;
    }
    int main()
    {
    	cin >> n >> c;
    	int ok;
    	memset(a,-1,sizeof(a));
    	while( cin >> ok && ok!=-1 )	a[ok]=1;//亮着 
    	while( cin >> ok && ok!=-1 )	a[ok]=0;//熄灭 
    	for(int i=0;i<=1;i++)
    	{
    		for(int j=0;j<=1;j++)
    		for(int q=0;q<=1;q++)
    		for(int w=0;w<=1;w++)
    		{
    			if(i+j+q+w>c)	continue;//次数太多
    			if( (i+j)%2==(q+w)%2&&c%2==1 )//那么i+j+q是偶数
    				continue;
    			if( (i+j)%2!=(q+w)%2&&c%2==0 )//那么i+j+q是奇数	
    				continue;
    			for(int i=1;i<=n;i++)	b[i]=1;//初始都是开灯 
    			if(i)	for(int i=1;i<=n;i++)	b[i]^=1;
    			if(j)	for(int i=1;i<=n;i+=2)	b[i]^=1;
    			if(q)	for(int i=2;i<=n;i+=2)	b[i]^=1;
    			if(w)	for(int i=1;i<=n;i+=3)	b[i]^=1;
    			int flag=1;
    			for(int s=1;s<=n;s++)
    			{
    				if( a[s]==-1 )	continue;
    				if( a[s]!=b[s] )	flag=0;
    			}
    			if(flag)	run();
    		}
    	}
    	sort(f+1,f+1+top);
    	if( top==0 )	cout<<"IMPOSSIBLE";
    	else
    		for(int i=1;i<=top;i++)	cout<<f[i]<<endl;
    }
    
    
    • 1

    [IOI 1998 / USACO2.2] 派对灯 Party Lamps

    信息

    ID
    1005
    时间
    1000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    8
    已通过
    8
    上传者