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 <bits/stdc++.h>
using namespace std;

vector<string> dfs(vector<string>& g, int level, const int n) {
    if (level == 1) return g;
    auto last = dfs(g, level - 1, n);
    int m = last.size();
    vector<string> 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<string> g(n);
        cin.ignore();
        for (int i = 0; i < n; i++) {
            getline(cin, g[i]);
        }
        int level = 0;
        cin >> level;
        vector<string> 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 <bits/stdc++.h>
using namespace std;

int main() {
    vector<string> 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;
}

 

 

### ACWing 785 快速排序 超时解决方案 当处理大规模数据集时,标准的快速排序实现可能会遇到性能瓶颈甚至超时。为了提高效率,可以考虑以下几种优化方法: #### 1. 随机化选取枢轴 通过随机选择枢轴来减少最坏情况的发生概率。这有助于平衡分区过程中的不均匀分布。 ```java import java.util.Random; public class QuickSort { private static final Random random = new Random(); public static void sort(int[] nums) { quicksort(nums, 0, nums.length - 1); } private static void quicksort(int[] a, int l, int r) { if (l >= r) return; // 使用随机索引作为枢纽元素 swap(a, l + random.nextInt(r - l + 1), r); int p = partition(a, l, r); quicksort(a, l, p - 1); quicksort(a, p + 1, r); } } ``` #### 2. 尾递归消除 采用迭代方式代替递归来降低栈空间消耗,并防止因过深调用而导致堆栈溢出错误。 ```java private static void quicksortIterative(int[] a, int lo, int hi) { Stack<Integer> stack = new Stack<>(); stack.push(lo); stack.push(hi); while (!stack.isEmpty()) { hi = stack.pop(); lo = stack.pop(); if (lo < hi) { int pi = partition(a, lo, hi); stack.push(lo); stack.push(pi - 1); stack.push(pi + 1); stack.push(hi); } } }[^1] ``` #### 3. 插入排序混合策略 对于较小规模子数组应用插入排序而非继续划分,因为后者在这种情况下反而更慢。 ```java if (hi <= lo + M) { Insertion.sort(aux, lo, hi); return; } // 对于小范围使用插入排序 ``` 其中 `M` 是一个经验值常量,默认设置为大约 10 左右即可获得良好效果。 这些改进措施能够显著提升快速排序算法的表现,在面对大数据输入时也能保持高效稳定的工作状态。值得注意的是,具体参数调整还需依据实际应用场景灵活决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值