数轴上n个点(a0,a1,.....an),长为L的绳子最多能覆盖多少个点。

题目来自于百度2014校园招聘研发工程师笔试题(深圳站)  中的一个题目,题目描述以下ios

 

题目:数轴上n个点(a0,a1,.....an),长为L的绳子最多能覆盖多少个点。ide

 

    刚开始把问题想的复杂化了,想引入动态规划和线段树,后来发现其实用一个队列模拟就能够了。并且能够直接使用STL的deque容器。spa

首先不停地向队列尾部插入点,当队列中的点没法被线段覆盖时则从队列首弹出点,直到队列中的元素能够从新被线段覆盖,这一过程模拟便可。code

 

代码以下:blog

 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 }
相关文章
相关标签/搜索