1. 程式人生 > 實用技巧 >1031 Hello World for U (20分)

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;
}