1 条题解

  • 0
    @ 2025-8-24 22:37:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Ginger_he
    .

    搬运于2025-08-24 22:37:29,当前版本为作者最后更新于2022-04-03 21:51:36,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    前置知识

    1. ab,xaa\leqslant b,x\leqslant a,则 xbx\leqslant b
    2. ab,xaa\geqslant b,x\geqslant a,则 xbx\geqslant b
    3. a>b,xa,xba>b,x\geqslant a,x\leqslant b,则 xx 无解

    题解

    首先,我们将字符为 LG 分别加入数组 aabb 中,并进行排序。然后我们 O(n2)O(n^2) 枚举,不妨假设枚举到 aia_ibjb_j,数组 a,ba,b 的大小分别为 x,yx,y

    由前置知识,我们可以得到:

    1. ai,ai+1,,axa_{i},a_{i+1},\cdots,a_x 都是满足条件的
    2. b1,b2,,bjb_1,b_2,\cdots,b_{j} 都是满足条件的
    3. 如果 ai<bja_i<b_j 则无解。

    因此,我们先判断一下 aia_ibjb_j 的大小关系,如果符合条件,ans=min{ans,i1+yj}ans=\min\{ans,i-1+y-j\},这样就得出答案了。

    优化

    数据加强版

    其实这道题是可以 O(nlogn)O(n\log n) 的。注意到枚举每一个 aia_i 时,i1i-1 是固定的,我们要让 yjy-j 尽量小,就是让 jj 尽量大。简单来说,就是要求 bb 数组中小于等于 aia_i 的最大值,在 bb 数组中二分即可,下面的代码还是 O(n2)O(n^2) 的。

    注意

    • 最坏情况下有 11 只奶牛猜的是对的,所以 ansans 要初始化为 n1n-1

    • 有可能说 L 或说 G 的奶牛全都是错的,注意细节。

    Code

    #include<bits/stdc++.h>
    using namespace std;
    #define N 1005
    int n,t,x,y,a[N],b[N],ans;
    char c;
    int main()
    {
    	scanf("%d",&n);
    	b[++y]=-1;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("\n%c%d",&c,&t);
    		if(c=='L') a[++x]=t;
    		else b[++y]=t;
    	}
    	sort(a+1,a+x+1);
    	sort(b+1,b+y+1);
    	a[++x]=1e9+1,ans=n-1;
    	for(int i=1;i<=x;i++)
    	{
    		for(int j=1;j<=y;j++)
    		{
    			if(a[i]>=b[j]) ans=min(ans,i-1+y-j);
    			else break;
    		}
    	}
    	printf("%d\n",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    7607
    时间
    2000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者