出题人题解 | #Tachibana Kanade Loves Sequence#

Tachibana Kanade Loves Sequence

https://ac.nowcoder.com/acm/problem/23342

原题解链接:https://ac.nowcoder.com/discuss/173818

简单的贪心题。最后一个测试点专门卡了一下n=0n=0可能让部分dalao的体验极差……出题人在此谢罪qwq

题目的含义其实是可以从{a},{b}\{a\}, \{b\}中选出若干个数,选择一个数代价为11,你的利益为你{a}\{a\}{b}\{b\}利益中的最小值。最大化你的利益。

我们记A=i=1naici,B=i=1nbidi,K=i=1nci+i=1ndiA=\sum^n_{i=1} a_ic_i, B=\sum^n_{i=1} b_id_i, K=\sum^n_{i=1} c_i + \sum^n_{i=1} d_i ,答案为min{A,B}C\min\{A,B\}-C

一个显然的贪心策略,是将两个序列从大到小排序,然后考虑A,BA,B中较小的那一个,从它所对应的序列Aai,Bbi(A对应a_i ​ ,B对应b_i ​ )中选出最大的没有被选的一个数,将它选中,直到我们找不到一个大于11的数。

下面我们来考虑这种贪心的正确性。假设我们在{ai}\{a_i\}中选择了k1k_1个数ai1,ai2,,aik1a_{i_1}, a_{i_2},\cdots, a_{i_{k_1}}{bi}\{b_i\}中选择了k2k_2个数bj1,bj2,,bjk2b_{j_1}, b_{j_2}, \cdots, b_{j_{k_2}},记这种取数方案为G(I,J)G(I,J),其中I={i1,i2,,ik1},J={j1,j2,,jk2}I=\{i_1,i_2,\cdots,i_{k_1}\}, J=\{j_1,j_2,\cdots,j_{k_2}\}。由于{ai}{bi}\{a_i\},\{b_i\}地位均等,因此我们不妨设A>BA>B

假设另有一种取数方案G(I,J)G'(I',J')GG更优,则显然有II,JJI'\subset I, J' \subset J。为什么?若存在一个下标jj,使得jJj\in J'jJj\notin J,则其一定选择了一个JJ中没有的jj,使得bj1>0b_j - 1>0,这与我们在选取中“直到我们找不到一个大于11的数”矛盾。同理,可证III' \subset I

那么,由上可得,G(I,J)G'(I', J')对应的方案,一定是从G(I,J)G(I,J)对应的方案中,将一些选择的数删去,使得答案更优。

  1. 若删去JJ中的某个数bjb_j 则会使KK减少11minA,B\min {A,B}减少bjb_j,答案会增 加1bj1-b_j ,但根据我们的取数方案,bj>1b_j > 1,因此答案会变得更差,与GG'更优矛盾

  2. 若删去II中的某个数aia_i 则会使KK减少11AA减少aia_i。根据我们的取数方案,我们每次都是从最小的收益对应的序列中选择的数,删去aia_i后,不可能有A>BA>B。为什么?考虑到我们从大到小选取{ai}\{a_i\}中的每一个数,且当且仅当ABA\leqslant B时,才会选择{ai}\{a_i\}中的数。显然,若删去aia_iA>BA>B,则我们不可能选择{ai}\{a_i\}中的数,更不可能选择aia_i。因此,必有A<BA<B。但考虑到我们选取时,序列中均为整数,因此显然有AB1A \leqslant B-1,这使得minA,B\min {A,B}至少减少了11,因此答案反而至少减少了00,因此答案不会变得更优。

综上,我们的贪心策略时正确的。


#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=(b);++i)
#define F2(i,a,b) for(int i=a;i<(b);++i)
#define dF(i,a,b) for(int i=a;i>=(b);--i)
#define MN 6000005
#define ll long long
int n,m,q,k;
int a[MN],b[MN],ap[MN],bp[MN];
int h[MN];
ll ans=0,ii=1,jj=1;
int main(){
    scanf("%d",&n);
    F(i,1,n)scanf("%d",a+i),ap[i]=i;
    F(i,1,n)scanf("%d",b+i),bp[i]=i;
    sort(ap+1,ap+n+1,[](int i,int j){return a[i]>a[j];});
    sort(bp+1,bp+n+1,[](int i,int j){return b[i]>b[j];});
    int i=1,j=1;
    ll s1=0,s2=0;
    while(i<=n||j<=n){
        int s;
        if(i<=n&&j<=n)s=s2<s1;
        else s=j<=n;
        if(s)s2+=b[bp[j++]];
        else s1+=a[ap[i++]];
        if(ans<min(s1,s2)-i-j+2)
            ans=min(s1,s2)-i-j+2,ii=i,jj=j;
    }printf("%lld\n",ans);
    F2(i,1,ii)h[ap[i]]=1;
    F(i,1,n)printf("%d ",h[i]);puts("");
    F(i,1,n)h[i]=0;
    F2(i,1,jj)h[bp[i]]=1;
    F(i,1,n)printf("%d ",h[i]);
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 11:05
点赞 评论 收藏
分享
安菲尔德星期三:63退休只是说63才能领退休金,不代表63还能有工作
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务