最少攔截系統
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 44415 Accepted Submission(s): 17334
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裏來求救了,請幫助計算一下最少需要多少套攔截系統.
#include<cstdio>
#include<algorithm>
#define N 100000
using namespace std;
int dp[N];
int a[N];
int n;
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
fill(dp,dp+n,1);
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(a[i]>a[j])
dp[i]=max(dp[i],dp[j]+1);
}
}
printf("%d\n",*max_element(dp,dp+n));
}
return 0;
}
#include<cstdio>
#include<algorithm>
#define N 100000
using namespace std;
int len;
int a[N];
int n;
int c[N];
int find(int l,int r,int x)
{
if(l==r ) return l;
int mid=(r+l)>>1;
if(c[mid]<x) return find(mid+1,len,x);
return find(l,mid,x);
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
len=0;
int j;
c[0]=-10000000;
for(int i=0;i<n;i++)
{
if(a[i]>c[len]) j=++len;
else j=find(1,len,a[i]);
c[j]=a[i];
}
printf("%d\n",len);
}
return 0;
}