第28场蓝桥入门赛

105 阅读1分钟

T5 破译密码

Johnson法则是1954年由 S. M. Johnson 提出,用于解决“两台机器调度问题”,可以保证最优的完成时间。

在“两台机器调度问题”中,有:

  • n个作业(Jobs):每个作业都必须依次经过两台机器加工。
  • 2台机器(Machine A 和 Machine B):每个作业必须先在A机器上加工,然后再到B机器上加工。

把作业分为两类:

  • AiBiA_i\leq B_i, 把 ii 放在前面执行(按 AiA_i 升序排序)
  • Ai>BiA_i>B_i, 把 ii 放在后边执行(按 BiB_i 降序执行)

之后按这个顺序依次处理作业。

时间复杂度 : O(NlogN)O(N\log N)

int n, a[N], b[N];
vector<pair<int, int>> work, t;

void solve(){
    int cnt = 0;
    cin >> n;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
    }
    for(int i = 1; i <= n; i ++){
        cin >> b[i];
        if(a[i] <= b[i]) {
            work.push_back({a[i], b[i]});
        }
        else {
            t.push_back({a[i], b[i]});
        }
    }
    sort(work.begin(), work.end());
    sort(t.begin(), t.end(), [&] (auto &a, auto &b) {
        return a.second > b.second;
    }); 
    for(auto &e : t) {
        work.push_back(e);
    }
    int t1 = 0, t2 = 0;
    for(auto [x, y] : work) { 
        t1 += x;
        if(t2 < t1) t2 = t1;
        t2 += y;
    }
    cout << max(t1, t2) << '\n';
}

T6 插入数字

给定一个正整数 N (1N10181\leq N \leq 10^{18}),如果在 N 的开头、结尾,或者任意两个相邻数字之间插入一个数字(0∼9),可以得到多少种不同的新数字?需要注意的是,为了保证数字的有效性,插入后的数字不能以 0 开头。

因为只插入一个数字,所以相当简单。以 12345 举例。

_1_2_3_4_5_

最后一个空填 0 ~ 9, 10 种。

倒数第二个填 0 ~ 9 \ {5}, 9 种。

倒数第三个填 0 ~ 9 \ {4}, 9 种.

....

第一个空有 8 种。

公式就是 len(str)×9\text{len}(str) \times 9