題目來自於百度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 }