3441. 重复者 - AcWing题库
给定一个仅包含一种字符和空格的模板,将之不断重复扩大。
例如,模板如下所示
# #
#
# #
那么,第 1 级的图形为
# #
#
# #
第 2 级的图形为
# # # #
# #
# # # #
# #
#
# #
# # # #
# #
# # # #
模板中包含多少元素,那么任意级别的图形中就包含多少元素。
模板或 1 级图形中的元素为单个字符,而高等级的图形中的元素为低一级别的图形。
现在给定模板,请你输出该模板的第 Q 级图形的具体图案。
输入包含多组测试数据。
每组数据第一行包含整数 N,表示模板的尺寸大小为 N×N。
接下来 N 行,每行包含 N 个字符,用来描述模板。
最后一行,包含一个整数 Q,表示所求的图形等级。
当输入 N=0时,表示输入结束。
每组数据输出一个所求的具体图案。
3≤N≤5,
输出图案保证尺寸不超过 3000×3000
每个输入最多包含 10组数据。
3
# #
#
# #
1
3
# #
#
# #
3
4
OO
O O
O O
OO
2
0
# #
#
# #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# #
# # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# #
# # # #
# #
#
# #
# # # #
# #
# # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# #
# # # #
# # # # # # # #
# # # #
# # # # # # # #
OO OO
O OO O
O OO O
OO OO
OO OO
O O O O
O O O O
OO OO
OO OO
O O O O
O O O O
OO OO
OO OO
O OO O
O OO O
OO OO
思路:
逐行变化,n * n 经过m次变化会变成n^m * n^m
!' '的位置会变成原先的图,‘ ’位置会形成n*n的‘ ’
#include
using namespace std;
vector dfs(vector& g, int level, const int n) {
if (level == 1) return g;
auto last = dfs(g, level - 1, n);
int m = last.size();
vector res(n * m, string(n * m, ' '));
int x = 0, y = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
for (x = 0; x < n; x++) {
for (y = 0; y < n; y++) {
if (last[i][j] != ' ') {
res[i * n + x][j * n + y] = g[x][y];
}
}
}
}
}
return res;
}
int main() {
int n = 0;
while (cin >> n && n) {
vector g(n);
cin.ignore();
for (int i = 0; i < n; i++) {
getline(cin, g[i]);
}
int level = 0;
cin >> level;
vector res;
res = dfs(g, level, n);
for (auto& i : res) {
cout << i << endl;
}
}
return 0;
}
3406. 日志排序 - AcWing题库
有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录:
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
其中 hs_10000_p
是计算任务的名称,2007-01-17 19:22:53,315
是计算任务开始执行的时间“年-月-日 时:分:秒,毫秒”,253.035(s)
是计算任务消耗的时间(以秒计)
请你写一个程序,对日志中记录计算任务进行排序。
时间消耗少的计算任务排在前面,时间消耗多的计算任务排在后面。
如果两个计算任务消耗的时间相同,则将开始执行时间早的计算任务排在前面。
日志中每个记录是一个字符串,每个字符串占一行。最后一行为空行,表示日志结束。
计算任务名称的长度不超过 10,开始执行时间的格式是 YYYY-MM-DD HH:MM:SS,MMM
,消耗时间小数点后有三位数字。
计算任务名称与任务开始时间、消耗时间之间以一个或多个空格隔开。
排序好的日志记录。每个记录的字符串各占一行。
输入的格式与输入保持一致,输入包括几个空格,你的输出中也应该包含同样多的空格。
日志中最多可能有 10000 条记录。
保证不存在开始执行时间和计算任务消耗时间都相同的任务。
开始执行时间保证合法,任务消耗时间不超过 10000。
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
hs_10001_p 2007-01-17 19:22:53,315 253.846(s)
hs_10002_m 2007-01-17 19:22:53,315 129.574(s)
hs_10002_p 2007-01-17 19:22:53,315 262.531(s)
hs_10003_m 2007-01-17 19:22:53,318 126.622(s)
hs_10003_p 2007-01-17 19:22:53,318 136.962(s)
hs_10005_m 2007-01-17 19:22:53,318 130.487(s)
hs_10005_p 2007-01-17 19:22:53,318 253.035(s)
hs_10006_m 2007-01-17 19:22:53,318 248.548(s)
hs_10006_p 2007-01-17 19:25:23,367 3146.827(s)
hs_10003_m 2007-01-17 19:22:53,318 126.622(s)
hs_10002_m 2007-01-17 19:22:53,315 129.574(s)
hs_10005_m 2007-01-17 19:22:53,318 130.487(s)
hs_10003_p 2007-01-17 19:22:53,318 136.962(s)
hs_10006_m 2007-01-17 19:22:53,318 248.548(s)
hs_10000_p 2007-01-17 19:22:53,315 253.035(s)
hs_10005_p 2007-01-17 19:22:53,318 253.035(s)
hs_10001_p 2007-01-17 19:22:53,315 253.846(s)
hs_10002_p 2007-01-17 19:22:53,315 262.531(s)
hs_10006_p 2007-01-17 19:25:23,367 3146.827(s)
思路:使用stringstream,将整行字符串按空格分隔存在缓存区,随后用sscanf从指定字符串中找到对应格式的子字符串存入指定位置,比较大小即可
#include
using namespace std;
int main() {
vector res;
string s;
while (getline(cin, s)) {
if (s.empty()) {
break;
}
res.push_back(s);
}
sort(res.begin(),res.end(),[&](const string& a, const string& b) {
stringstream ssa(a), ssb(b);
string sa[4], sb[4];
for(int i = 0; i < 4; i++) {
ssa>> sa[i];
ssb>> sb[i];
}
if(sa[3] == sb[3]) return sa[1] + sa[2] < sb[1] + sb[2];
double ta, tb;
sscanf(sa[3].c_str(), "%lf(s)", &ta);
sscanf(sb[3].c_str(), "%lf(s)", &tb);
return ta < tb;
});
for(auto& i : res) cout << i << endl;
return 0;
}