PAT - 1031 Hello World for U

🔗 ​https://pintia.cn/problem-sets/994805342720868352/problems/994805462535356416

题目大意

给出一段字符串,用“U”的形状输出这个字符串。

其中,左边和右边字符数相等,这里记为 n1

下面字符串记为 n2

n1 不能大于 n2

n1 为满足以上条件的最大值。

分析

假设n = 字符串长度 + 2,因为2 * n1 + n2 = n,且要保证n2 >= n1, n1尽可能地大,分类讨论:

  1. 如果n % 3 == 0,n正好被3整除,直接n1 == n2 == n3;
  2. 如果n % 3 == 1,因为n2要比n1大,所以把多出来的那1个给n2
  3. 如果n % 3 == 2, 就把多出来的那2个给n2
    所以得到公式:n1 = n / 3,n2 = n / 3 + n % 3
    把它们存储到二维字符数组中,一开始初始化字符数组为空格,然后按照u型填充进去,最后输出这个数组u

总结

今天是我重新拾起PAT的第一天,是的,在断断续续,反复拾起又放下数次之后,我又开始了,毕竟是要准备秋招的嘛。。。

很久不做题目的后果就是重新拾起来真的是非常地痛苦了。。。

这道题其实很简单啊,主要是学会分析问题,我一开始看到那个数学公式就害怕了。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstring>
using namespace std;

string str;
char res[50][50];
int n1, n2, len;
int pos = 0;

int main () {
// freopen("in", "r", stdin);
cin >> str;
memset(res, ' ', sizeof(res));
len = str.length() + 2;
n1 = len / 3;
n2 = n1 + len % 3;
for (int i = 0; i < n1; ++i) res[i][0] = str[pos++];
for (int i = 1; i <= n2 - 2; ++i) res[n1 - 1][i] = str[pos++];
for (int i = n1 - 1; i >= 0; --i) res[i][n2 - 1] = str[pos++];
for (int i = 0; i < n1; ++i) {
for (int j = 0; j < n2; ++j) {
cout << res[i][j];
}
cout << endl;
}
return 0;
}
文章作者: Yeoman Li
文章链接: https://yeomanli.github.io/2019/05/13/PAT---1031-Hello-World-for-U/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yeoman's Blog