Let life be beautiful|

Ginger_he

园龄:3年1个月粉丝:5关注:5

洛谷P8267题解

本文同步更新于洛谷博客

前置知识

  1. ab,xa,则 xb
  2. ab,xa,则 xb
  3. a>b,xa,xb,则 x 无解

题解

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

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

  1. ai,ai+1,,ax 都是满足条件的
  2. b1,b2,,bj 都是满足条件的
  3. 如果 ai<bj 则无解。

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

优化

其实这道题是可以 O(nlogn) 的。注意到枚举每一个 ai 时,i1 是固定的,我们要让 yj 尽量小,就是让 j 尽量大。简单来说,就是要求 b 数组中小于等于 ai 的最大值,在 b 数组中二分即可。为了防止某些居心叵测的人,下面的代码还是 O(n2) 的。

注意

  • 最坏情况下有 1 只奶牛猜的是对的,所以 ans 要初始化为 n1

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);
    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);
    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;
}

本文作者:Ginger_he

本文链接:https://www.cnblogs.com/Gingerhe/p/16097525.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ginger_he  阅读(65)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起