前言

传送门

正文

思路

由题意可知,这个U需要尽可能的正,于是给出我们限制条件,即
n1=n3=max{k|k<=n2,3<=n2<=N} ;同时n1+n2+n3-2=N。可以看出,n1
就是我们需要输出的行数,n2就是我们需要输出的列数,也就是说,
U形图形两侧的字符数n1和n3总是不超过n2,同时需要是n1和n2尽可能大,
可以参考PAT B1027打印沙漏的思路,由等式n1+n2+n3-2=N推出2*k+n2-2=N,
又因为k<=n2,因此得出k<= (N+2)/3,也就是说k最大是(N+2)/3

参考题解

#include<iostream>
#include<string>
using namespace std;
/*
由题意可知,这个U需要尽可能的正,于是给出我们限制条件,即
n1=n3=max{k|k<=n2,3<=n2<=N} ;同时n1+n2+n3-2=N。可以看出,n1
就是我们需要输出的行数,n2就是我们需要输出的列数,也就是说,
U形图形两侧的字符数n1和n3总是不超过n2,同时需要是n1和n2尽可能大, 
可以参考PAT B1027打印沙漏的思路,由等式n1+n2+n3-2=N推出2*k+n2-2=N,
又因为k<=n2,因此得出k<= (N+2)/3,也就是说k最大是(N+2)/3 
*/
int main(){
	string str;
	int N,n1,n2,n3;
	cin>>str;
	N=str.size();
	n1=(N+2)/3,n3=n1,n2=N+2-2*n1;
	//先输出n1-1行,注意字符下标是对称的,最后直接输出底部最后一行 
	for(int i=0;i<n1-1;i++){
		cout<<str[i];
		//输出n2-2个空格 
		for(int j=0;j<n2-2;j++)cout<<" "; 
		//输出对称位置的字符
		cout<<str[N-1-i]<<endl;
	}
	//输出最后一行
	for(int i=n1-1;i<N-(n1-1);i++){
		cout<<str[i];
	}
	cout<<endl;
	return 0;
}