题目:
题目思路:
开始判断能否构造
再判断是否需要进行特殊处理
然后对类别m进行遍历
分垂直对称的后相同的一对字符
和垂直对称后和自己仍然相同的字符
遍历完全后
如n仍未取完
进行中间加重复值
代码详解:
(注:代码中的(n+1)/2 + min(n/2,5) 是指能够取的最大的字符数类似总数)
#include<stdio.h>
#include<iostream>
using namespace std;
#include<string>
string s1="H\"!\'*+-.8:=^_WTYUIOA0XVM|";//注:(\")代表"
string s2="<>\\/[]{}()";//注:(\\)代表一个斜杠
int main()
{
int n,m;
cin>>n>>m;
if(m>35||(n+1)/2 + min(n/2,5) < m)//判断是否能进行构造
{
cout<<"-1";
return 0;
}
string l,r,mid;
if(n&1)//n为奇数时,去掉中间值多余值
{
mid="H";
m--;
n--;
}
else if(n-m>=2)//n为偶数,一开始就取两个,方便后期进行补n操作
{
mid="HH";
n-=2;
m--;
}
for(int i=0;m>=2&&i<s2.size();i+=2)//对不同字符但放在两边可以垂直对称的字符遍历
{
l+=s2[i];
r=s2[i+1]+r;
m-=2;
n-=2;
}
for(int i=1;i<s1.size()&&m>=1;i++)//对垂直对称后仍然和原字符一样的字符进行遍历
{
l+=s1[i];
r=s1[i]+r;
m--;
n-=2;
}
for(int i=1;i<=n;i++)//m种类型已经遍历完成,中间插入剩余还需要的字符数(补n操作)
{
mid+='H';
}
cout<<l+mid+r<<endl;
return 0;
}
PS: 新的一年要快乐!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|