1031 Hello World for U (20 分)
Given any string of N (≥5) characters, you are asked to form the characters into the shape of U. For example, helloworld can be printed as:
h d
e l
l r
lowo
That is, the characters must be printed in the original order, starting top-down from the left vertical line with n1 characters, then left to right along the bottom line with n2 characters, and finally bottom-up along the vertical line with n3 characters. And more, we would like U to be as squared as possible – that is, it must be satisfied that n1=n3=max { k | k≤n2 for all 3≤n2≤N } with n1+n2+n3−2=N.
Input Specification:
Each input file contains one test case. Each case contains one string with no less than 5 and no more than 80 characters in a line. The string contains no white space.
Output Specification:
For each test case, print the input string in the shape of U as specified in the description.
Sample Input:
helloworld!
Sample Output:
h !
e d
l l
lowor
Code:
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
int main()
{
string s;
cin >> s;
string sa[3];
int m = s.length() / 3;
switch (s.length() % 3)
{
case 0:
sa[0] = s.substr(0, m - 1);
sa[1] = s.substr(m - 1, m + 2);
sa[2] = s.substr(2 * m + 1, m - 1);
break;
case 1:
sa[0] = s.substr(0, m);
sa[1] = s.substr(m, m + 1);
sa[2] = s.substr(2 * m + 1, m);
break;
case 2:
sa[0] = s.substr(0, m);
sa[1] = s.substr(m, m + 2);
sa[2] = s.substr(2 * m + 2, m);
break;
default:
break;
}
for (int i = 0; i < sa[0].length(); i++)
{
cout << sa[0][i] << setw(sa[1].length() - 1) << setfill(' ') << sa[2][sa[2].size() - i - 1] << endl;
}
for (int i = 0; i < sa[1].length(); i++)
{
cout << sa[1][i];
}
cout << endl;
return 0;
}
思路
这题是要分类讨论,按字符串长度N被3除后的余数分类,一共三类:0,1,2。
假设N = 3m (m is postive int),
因为 n1 + n2 + n3 = N + 2 = 3m + 2
而且 n1 = n3 <= n2
所以 3m + 2 <= 3n2
所以 n2>= m + 2/3
所以 n1 + n3 + m + 2/3 < 3m + 2
所以 n1 = n3 <= m + 2/3
又因为 n1,n3取最大值
所以 n1 = n3 = m
所以 n2 = m + 2
为了输出方便把N + 2这多处来的2分给n2
实际上字符串1和3长度为m - 1,字符串2长度为m + 2
其他两种情况同理