题目链接
http://codeforces.com/problemset/problem/1029/B
题意
给定一个长度为n的序列a[1..n].
要求从中选取一个最长的序列b(可以不连续),使得b[i]*2<=b[i+1].
题解
一开始想到的是dp。
设dp[i]表示以第i个数结尾的最长序列长度。
dp[i]=1.
如果dp[j]*2<=dp[i],那么
dp[i]=max(dp[i],dp[j]+1),1<=j<=i-1.
时间复杂度上界是O(n^2).
写了一发果真超时了。
再观察发现,如果dp[j]*2<=dp[i],那么dp[j+1]*2<=dp[i].也就是说这个最长序列一定连续的。
遍历一遍序列将序列分割成若干个连续的序列,取最长的序列即可。
时间复杂度O(n)。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int a[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int l=1,r=1,ans=1;
while(r<=n)
{
while(r<=n && a[r]*2>=a[r+1]) r++;
if(r<=n)
{
// cout<<"l="<<l<<" "<<"r="<<r<<endl;
ans=max(ans,r-l+1);
// cout<<ans<<endl;
l=r+1;
r++;
}
else
{
ans=max(ans,r-l);
}
}
printf("%d\n",ans);
}
}