为了增加顾客,Sally的店铺决定提供免费午餐,顿时门庭若市,但是不久Sally的原材料不足了….因此Sally决定公布一项决定:凡是来本店吃免费午餐的,一天吃能吃一次,吃的数量必须比上一次吃的少, 点的必须在上一次后面,且免费午餐将只有N个种类任君选择,为了能吃到最多的免费午餐,你将如何安排每日吃的数量呢?
input:
第一行一个数N,表示免费午餐的种类(0<=N<=100000)
第二行N个数,表示每个免费午餐的数量(0<=数量<=100000)
output:
一个数,表示最多能吃多少天
input:
5
5 4 3 2 1
outpu:
5
【参考程序】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int n,i,j,ans,low,high;
int a[100010],b[100010];
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
ans=0;
for (i=n;i>=1;i--)
{
if (a[i]==0) continue;
low=1;high=ans;
while (low<=high)
{
int mid=(low+high)/2;
if (b[mid]<a[i]) low=mid+1;
else high=mid-1;
}
if (low>ans) ans++;
b[low]=a[i];
}
printf("%d\n",ans);
system("pause");
return 0;
}