数轴上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 }
原文地址:https://www.cnblogs.com/sworddance/p/3359288.html