Acwing 3441. 重复者 && 3406. 日志排序

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

 

 

你可能感兴趣的:(算法)