题意
传送门 P1248 加工生产调度 & P2123 皇后游戏
题解
P 1248 P1248 P1248 中产品 i i i 完成时间的数学表达式为 P 2123 P2123 P2123 中的 c i c_i ci,即
c i = { a 1 + b 1 , i = 1 max { c i − 1 , ∑ j = 1 i a j } + b i , 2 ≤ i ≤ n c_i=\begin{cases} a_1+b_1 & ,i=1 \\ \max\bigg\{c_{i-1},\sum\limits_{j=1}^{i}a_j\bigg\}+b_i & ,2\leq i\leq n\\ \end{cases} ci=⎩⎪⎨⎪⎧a1+b1max{
ci−1,j=1∑iaj}+bi,i=1,2≤i≤n 容易观察到 c i c_i ci 随着 i i i 增大而递增,那么目标为最小化 c n c_n cn。
考虑贪心策略,尝试邻项交换。交换 i , i + 1 i,i+1 i,i+1 项不会影响 c j ( 1 ≤ j < i ) c_j(1\leq j<i) cj(1≤j<i),若交换后使 c i + 1 c_{i+1} ci+1 不变或更小,则不会使 c j ( i + 1 < j ≤ n ) c_j(i+1<j\leq n) cj(i+1<j≤n) 更大。设 c = c i , s = ∑ j = 1 i + 1 c=c_i,s=\sum\limits_{j=1}^{i+1} c=ci,s=j=1∑i+1,若满足下式,则交换 i , i + 1 i,i+1 i,i+1 项使 c i + 1 c_{i+1} ci+1 更小,此时不会使结果更差
max { c + b i , s − a i + 1 + b i , s } + b i + 1 > max { c + b i + 1 , s − a i + b i + 1 , s } + b i \max\{c+b_i,s-a_{i+1}+b_i,s\}+b_{i+1}>\max\{c+b_{i+1},s-a_i+b_{i+1},s\}+b_i max{
c+bi,s−ai+1+bi,s}+bi+1>max{
c+bi+1,s−ai+bi+1,s}+bi 简单变形得到
max { c , s − a i + 1 , s − b i } + b i + b i + 1 > max { c , s − a i , s − b i + 1 } + b i + b i + 1 \max\{c,s-a_{i+1},s-b_i\}+b_i+b_{i+1}>\max\{c,s-a_i,s-b_{i+1}\}+b_i+b_{i+1} max{
c,s−ai+1,s−bi}+bi+bi+1>max{
c,s−ai,s−bi+1}+bi+bi+1 若要满足不等号,则不等号取决于左右式中的不公共相同的项。那么有
max { − a i + 1 , − b i } > max { − a i , − b i + 1 } \max\{-a_{i+1},-b_i\}>\max\{-a_i,-b_{i+1}\} max{
−ai+1,−bi}>max{
−ai,−bi+1} 变形得到
min { a i + 1 , b i } < min { a i , b i + 1 } \min\{a_{i+1},b_{i}\}<\min\{a_i,b_{i+1}\} min{
ai+1,bi}<min{
ai,bi+1} 设关系 o p ( i , j ) op(i,j) op(i,j) 为真时,满足 min { a j , b i } > min { a i , b j } \min\{a_{j},b_{i}\}>\min\{a_{i},b_{j}\} min{
aj,bi}>min{
ai,bj},容易证明其满足非自反性、非对称性与传递性。传递性证明如下,设 o p ( i , j ) , o p ( j , k ) op(i,j),op(j,k) op(i,j),op(j,k),则有
min { a j , b i } > min { a i , b j } , min { a k , b j } > min { a j , b k } \min\{a_{j},b_{i}\}>\min\{a_{i},b_{j}\},\ \min\{a_{k},b_{j}\}>\min\{a_{j},b_{k}\} min{
aj,bi}>min{
ai,bj}, min{
ak,bj}>min{
aj,bk} 左右式取 min \min min 得到 min { a j , b j , a k , b i } > min { a j , b j , a i , b k } \min\{a_j,b_j,a_k,b_i\}>\min\{a_j,b_j,a_i,b_k\} min{
aj,bj,ak,bi}>min{
aj,bj,ai,bk} 与前述同理,若要满足不等号,则不等号取决于左右式中的不公共相同的项,那么有
min { a k , b i } > min { a i , b k } \min\{a_k,b_i\}>\min\{a_i,b_k\} min{
ak,bi}>min{
ai,bk} 即 o p ( i , k ) op(i,k) op(i,k),证毕。上述仅证明了关系 o p op op 满足严格偏序,若要使用 s t d : : s o r t std::sort std::sort 进行排序, o p op op 还需要满足等价的传递性。加上严格偏序条件,即 o p op op 需要满足严格弱序(Strict Weak Ordering,附上详解 博客)。
s t d : : s o r t std::sort std::sort 使用严格的 < < < 进行排序,若 i , j i,j i,j 满足 ! o p ( i , j ) & & ! o p ( j , i ) !op(i,j)\ \&\&\ !op(j,i) !op(i,j) && !op(j,i),那么认为 i , j i,j i,j 是等价的。等价的传递性即,若 ! o p ( i , j ) & & ! o p ( j , i ) !op(i,j)\ \&\&\ !op(j,i) !op(i,j) && !op(j,i) 且 ! o p ( j , k ) & & ! o p ( k , j ) !op(j,k)\ \&\&\ !op(k,j) !op(j,k) && !op(k,j),则 ! o p ( i , k ) & & ! o p ( k , i ) !op(i,k)\ \&\&\ !op(k,i) !op(i,k) && !op(k,i)。
关系 o p op op 不满足等价的传递性,这是因为在不等号中加入等号后,前述消去左右式公共相同项的操作不再能保证正确性。需要对关系进行修改,使之在满足邻项交换后可能使答案更差的前提下,保证等价的传递性。 ! o p ( i , j ) !op(i,j) !op(i,j) 即满足 min { a j , b i } ≤ min { a i , b j } \min\{a_{j},b_{i}\}\leq\min\{a_{i},b_{j}\} min{ aj,bi}≤min{ ai,bj}, < < < 可以交换左右项后变换为 > > >,显然满足传递性。那么重点考虑 min { a j , b i } = min { a i , b j } \min\{a_{j},b_{i}\}=\min\{a_{i},b_{j}\} min{ aj,bi}=min{ ai,bj} 的情况。
反方向考虑前述消去公共相同项的方法,为了使满足等号的影响项尽可能少,尝试添加左右式的公共相等项。考虑 a i , a j a_i,a_j ai,aj,观察 c k c_k ck 的定义,容易发现 a i , a j a_i,a_j ai,aj 升序排序不会使结果更差。可以证明,在 min { a j , b i } = min { a i , b j } \min\{a_{j},b_{i}\}=\min\{a_{i},b_{j}\} min{
aj,bi}=min{
ai,bj} 情况下将 a i , a j a_i,a_j ai,aj 升序排序满足等价的传递性。最终得到排序条件
{ min { a j , b i } > min { a i , b j } , min { a j , b i } ≠ min { a i , b j } a i < a j , min { a j , b i } = min { a i , b j } \begin{cases} \min\{a_j,b_i\}>\min\{a_i,b_j\} & ,\min\{a_j,b_i\}\neq\min\{a_i,b_j\} \\ a_i<a_j & ,\min\{a_j,b_i\}=\min\{a_i,b_j\} \\ \end{cases} {
min{
aj,bi}>min{
ai,bj}ai<aj,min{
aj,bi}=min{
ai,bj},min{
aj,bi}=min{
ai,bj} 排序后模拟即可,总时间复杂度 O ( N log N ) O(N\log N) O(NlogN)。
P 1248 P1248 P1248 代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1005;
struct people
{
int a, b, k;
bool operator<(const people &o) const
{
return min(o.a, b) != min(a, o.b) ? min(o.a, b) > min(a, o.b) : a < o.a;
}
} P[maxn];
int N;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> N;
for (int i = 0; i < N; ++i)
cin >> P[i].a;
for (int i = 0; i < N; ++i)
cin >> P[i].b, P[i].k = i;
sort(P, P + N);
ll c = 0, s = 0;
for (int i = 0; i < N; ++i)
{
s += P[i].a;
c = max(c, s) + P[i].b;
}
cout << c << '\n';
for (int i = 0; i < N; ++i)
cout << P[i].k + 1 << (i == N - 1 ? '\n' : ' ');
return 0;
}
P 2123 P2123 P2123 代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 20005;
struct people
{
int a, b;
bool operator<(const people &o) const
{
return min(o.a, b) != min(a, o.b) ? min(o.a, b) > min(a, o.b) : a < o.a;
}
} P[maxn];
int T, N;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> T;
while (T--)
{
cin >> N;
for (int i = 0; i < N; ++i)
cin >> P[i].a >> P[i].b;
sort(P, P + N);
ll c = 0, s = 0;
for (int i = 0; i < N; ++i)
{
s += P[i].a;
c = max(c, s) + P[i].b;
}
cout << c << '\n';
}
return 0;
}