数轴上n个点(a0,a1,.....an),长为L的绳子最多能覆盖多少个点。
题目来自于百度2014校园招聘研发工程师笔试题(深圳站) 中的一个题目,题目描述如下
题目:数轴上n个点(a0,a1,.....an),长为L的绳子最多能覆盖多少个点。
刚开始把问题想的复杂化了,想引入动态规划和线段树,后来发现其实用一个队列模拟就可以了。而且可以直接使用STL的deque容器。
首先不停地向队列尾部插入点,当队列中的点无法被线段覆盖时则从队列首弹出点,直到队列中的元素可以重新被线段覆盖,这一过程模拟即可。
代码如下:
1 #include<iostream> 2 #include<deque> 3 using namespace std; 4 int main(){ 5 int l,n; 6 int queuelen=0; 7 cin>>l>>n; 8 deque<int> ideque; 9 10 int count=0; 11 int num=0; 12 int maxans=0; 13 while(count<n){ 14 while(queuelen<l&&count<n){ 15 int a; 16 cin>>a; 17 if(ideque.size()==0){ 18 queuelen=0; 19 }else{ 20 queuelen+=a-ideque.back(); 21 } 22 ideque.push_back(a); 23 count++; 24 num++; 25 } 26 if (maxans<(num-1)) maxans=num-1; 27 while (queuelen>=l){ 28 int out=ideque.front(); 29 ideque.pop_front(); 30 if(ideque.size()==0){ 31 queuelen=0; 32 }else{ 33 queuelen-=(ideque.front()-out); 34 } 35 num--; 36 } 37 } 38 cout<<"ans:"<<maxans<<endl; 39 system("pause"); 40 return 0; 41 }