P1248 & P2123 严格弱序 + 贪心

题意

传送门 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{ ci1,j=1iaj}+bi,i=1,2in 容易观察到 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(1j<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<jn) 更大。设 c = c i , s = ∑ j = 1 i + 1 c=c_i,s=\sum\limits_{j=1}^{i+1} c=ci,s=j=1i+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,sai+1+bi,s}+bi+1>max{ c+bi+1,sai+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,sai+1,sbi}+bi+bi+1>max{ c,sai,sbi+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;
}

猜你喜欢

转载自blog.csdn.net/neweryyy/article/details/119303950