【SSL】20210809A

【SSL】20210809A


题目描述

定义操作a(X)b= ((a&b) + (a|b))>>1
给出n个数ai
每次用操作合并任意相邻ai
求进行n-1次操作以后可能得到的最终结果
所有结果从小到大输出

输入格式

第一行一个n
第二行给出a1,a2,...,an-1,an

输出格式

按照题目要求作答

输入样例

4
1 4 3 2

输出样例

1 2

解题思路

枚举区间的起点和终点,然后枚举中间的分界点,判断左右两个小区间能否合成这个数,如果可以,改为true,否则为false。

Code

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int a[200];
bool b[200][200][10];
int hb(int x,int y)
{
	int z;
	z=(x&y)+(x|y);
	z=z>>1;
	return z;
}
int main()
{
	int c,n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
	    cin>>a[i];
	    b[i][i][a[i]]=true;
	}
	for(int i=2;i<=n;i++)
	{
		for(int j=i;j>=1;j--)
		{
			for(int mid=j;mid<i;mid++)
			{
				c=0;
			    for(int l=0;l<=7;l++)
			    {
			    	if(!b[j][mid][l]) continue;
			    	for(int r=0;r<=7;r++)
			    	{
			    		if(!b[mid+1][i][r]) continue;
			    		c=hb(l,r);
			    		b[j][i][c]=true;
					}
				}
			}
		}
	}
	for(int i=0;i<=7;i++)
	 if(b[1][n][i]) cout<<i<<" ";
}

谢谢阅读

posted @ 2021-08-18 22:02  基德不基  阅读(28)  评论(0)    收藏  举报