T5 破译密码
Johnson法则是1954年由 S. M. Johnson 提出,用于解决“两台机器调度问题”,可以保证最优的完成时间。
在“两台机器调度问题”中,有:
- n个作业(Jobs):每个作业都必须依次经过两台机器加工。
- 2台机器(Machine A 和 Machine B):每个作业必须先在A机器上加工,然后再到B机器上加工。
把作业分为两类:
- 若 , 把 放在前面执行(按 升序排序)
- 若 , 把 放在后边执行(按 降序执行)
之后按这个顺序依次处理作业。
时间复杂度 :
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 (),如果在 N 的开头、结尾,或者任意两个相邻数字之间插入一个数字(0∼9),可以得到多少种不同的新数字?需要注意的是,为了保证数字的有效性,插入后的数字不能以 0 开头。
因为只插入一个数字,所以相当简单。以 12345 举例。
_1_2_3_4_5_
最后一个空填 0 ~ 9, 10 种。
倒数第二个填 0 ~ 9 \ {5}, 9 种。
倒数第三个填 0 ~ 9 \ {4}, 9 种.
....
第一个空有 8 种。
公式就是 。