poj 3069 贪心 寻找满足某个要求的最大元素

来源:互联网 发布:centos rpm package 编辑:程序博客网 时间:2024/06/05 18:36

和离散中的灯塔问题还不太一样,是要求必须要放在石子的位置上。但是其实思想是一样的,同样是找到最右边的点,但是这里涉及到一个怎么实现的问题。我们的目标是,对于每个点,如果它没有被覆盖,从这个点开始,找到它最右边能覆盖到它的点。

对于实现问题:后来才发现其实和快排差不多。

第一次的代码

#include <iostream>#include <cmath>using namespace std;const int maxn=1005;int a[maxn];int main(int argc, char const *argv[]){int r,n;while(cin>>r>>n){if(r==-1) break;for(int i=0;i<n;i++) cin>>a[i];sort(a,a+n);int ans=0;int pos=-0x99999;for(int i=0;i<n;i++){if(abs(a[i]-pos)<=r) continue;else{int right=i;while(a[right+1]-a[i]<=r) right++;pos=a[right];ans++;}}cout<<ans<<endl;}return 0;}
这会有个问题:1.right是n的时候数组越界  (对答案是会有影响的,除非在最后一次才越界(此时答案的ans不会改变),但是如果在之前越界,会改变pos的值),所以应该对right 加上限制

应该加上right+1<n的限制

这里要注意两点:

找满足要求的最大或者最小值,一般是用循环做的,但是特别要注意边界情况的判断,就像快排一样!

   

这里要注意的是,这个pos的位置可能比当前的i大很多,并且我们发现中间的continue过程其实是可以忽略一些的

(补上i=right)


0 0
原创粉丝点击