| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
n log n算法#include <stdio.h>
const int L=1001;
float a[L],up[L],down[L];
int f1[L],f2[L],ans,now,n;
int find(float x,int right,float b[]){
if (x<=b[1])return 1;
int i=1,j=right;
while(i!=j-1||i==j){
if (b[right=(i+j)/2]<x)i=right;
else j=right;
}
return j;
}
int main(void){
freopen ("1836.in","r",stdin);
freopen ("1836.out","w",stdout);
scanf ("%d",&n);
for (int i=1;i<=n;i++)scanf ("%f",a+i);
f1[1]=1,up[1]=a[1],now=1;
for (int i=2;i<=n;i++)
if (a[i]>up[now])up[++now]=a[i],f1[i]=now;
else f1[i]=find(a[i],now,up),up[f1[i]]=a[i];
f2[n]=1,down[1]=a[n],now=1;
/*for (int i=1;i<=n;i++)
printf ("%.0f ",up[i]);
printf ("\n");*/
for (int i=n-1;i>=1;i--)
if (a[i]>down[now])down[++now]=a[i],f2[i]=now;
else f2[i]=find(a[i],now,down),down[f2[i]]=a[i];
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
if (f1[i]+f2[j]>ans)ans=f1[i]+f2[j];
printf ("%d",n-ans);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator