數軸上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 }
相關文章
相關標籤/搜索