1031 Hello World for U (20分)

读题不认真,以为是水题,没想到还要小推导一下+_+

\(n_1\)\(n_3\)是左右两条竖线从上到下的字符个数,\(n_2\)是底部横线从左到右的字符个数。

要求:

  • \(n_1=n​_3=max \{ k | k≤n_2\ for\ all\ 3≤n_2≤N \}\)
  • \(n_1+n_2+n_3-2=N\)
  • \(N>=5\)

\(n = N+ 2\),因为\(2n_1 + n_2 = n\),且\(n_2 >= n_1\), 要求\(n_1\)尽可能大

  1. 如果\(n \mod 3 = 0\)\(n\)正好被\(3\)整除,因为要求\(n_1\)尽可能大,故\(n_1 = n_2 = n_3\)
  2. 如果\(n \mod 3 = 1\),因为\(n_2\)要比\(n_1\)大,所以把多出来的那1个给\(n_2\)
  3. 如果\(n \mod 3 = 2\), 就把多出来的那\(2\)个给\(n_2\)
string s;
int n;

int main()
{
    cin>>s;
    n=s.size();

    int h=(n+2)/3;
    int b=h+(n+2)%3;

    for(int i=0;i<h-1;i++)
    {
        cout<<s[i];
        for(int j=0;j<b-2;j++)
            cout<<' ';
        cout<<s[n-1-i]<<endl;
    }

    for(int i=0;i<b;i++)
    {
        cout<<s[h-1+i];
    }
    cout<<endl;

    //system("pause");
    return 0;
}
posted @ 2021-01-09 11:12  Dazzling!  阅读(60)  评论(0编辑  收藏  举报