【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<<" ";
}
谢谢阅读
本文来自博客园,作者:基德不基,转载请注明原文链接:https://www.cnblogs.com/ssllyw/p/15159074.html

浙公网安备 33010602011771号