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;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14254390.html