记录编号 | 416384 | 评测结果 | AAAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [USACO Feb08] 麻烦的聚餐 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | 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; }