记录编号 416384 评测结果 AAAAAAAAAAA
题目名称 [USACO Feb08] 麻烦的聚餐 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2017-06-21 14:02:30 内存使用 0.66 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,a[30005],mid,f1[30005],f2[30005],h1,h2;
int main()
{
	freopen("egroup.in","r",stdin);
	freopen("egroup.out","w",stdout);
//	freopen("1.txt","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	{
		if(a[i]>=f1[h1])
		f1[++h1]=a[i];
		else
		{
			int l=1,r=h1;
			while(l<r)
			{
				int mid=(l+r)/2;
				if(f1[mid]<=a[i])
				l=mid+1;
				else r=mid;
			}
			f1[l]=a[i];
		}
	}
	memset(f2,0x7f,sizeof(f2));
	for(int i=1;i<=n;i++)//简述一下调这道题的脑残经历,第二次找直接把第一次粘来的f2一直弄成f1,我一直以为是二分写错了结果我发现我把第一个循环改了会影响第二个循环出来的结果
	//我就懵逼了卡了半小时将近才发现二分里面的f2写成f1了 
	{
		if(a[i]<=f2[h2])
		f2[++h2]=a[i];
		else
		{
			int l=1,r=h2;
			while(l<r)
			{
				int mid=(l+r)/2;
				if(f2[mid]>=a[i])
				l=mid+1;
				else r=mid;
			}
			f2[l]=a[i];
		}//cout<<h2<<" ";
	}//cout<<h1<<" "<<h2<<" ";
	h1=max(h1,h2);
	cout<<n-h1;
	return 0;
}