8593 最大覆盖问题
时间限制:200MS 代码长度限制:10KB
提交次数:193 通过次数:88
题型: 编程题 语言: G++;GCC;VC;JAVA
Description
输入格式
第1行是正整数n,(n<=10000) 第2行是整数序列 a1 a2 ... an
输出格式
计算出的最大覆盖区间长度。
输入样例
10 1 6 2 1 -2 3 5 2 -4 3
输出样例
5
提示
题目中的样例,结果为5,是因为最大覆盖区间段为:2 1 -2 3 5,因此最大覆盖的区间长度为5。 若依次去求出每个数的最大覆盖长度,则必须有两个嵌套的循环,时间复杂度为O(n^2)。 但此处求所有数的一个最大覆盖长度,倒没有必要每个数的最大覆盖长度都求出来。 初始时,用两个指针i和j指向串末,当ai和aj的关系满足不等式时,j不动,i往左 走,……,直到不等式不满足,记录下长度。 下一步j往左移一个,i不回退,继续上面的比较,若找到更长的覆盖长度,更新。 每循环一次要么i要么j少1;最后i=-1,j=0;共进行了2(n-1)次。所以时间复杂度为O(n)。
作者
zhengchan
根据提示使用双指针,代码oj提交成功。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int i,j=0;
int a[n];
for(i=0;i<n;i++)
{
cin>>a[i];
}
int L=0;
i=n-1;
j=n-1;
while(i>-1)
{
if(a[i]<=abs(a[j]))
{
L=max(L,j-i+1);
i--;
}
else
{
j--;
}
}
cout<<L;
return 0;
}