POJ 3069(Saruman's Army)(贪心算法)
原题链接:http://poj.org/problem?id=3069
该题目思路相对简单,即从最左边向右以此判断即可
#include <iostream>
#include<algorithm>
using namespace std;
const int MAX_N=1000;
int n,R,x[MAX_N];
void solve()
{
sort(x,x+n);//为什么需要对数组中的元素进行排序,输入端得到的数据本身可能并不是有序的
int i=0,ans=0;
while(i<n)
{//s是没有被覆盖的最左的点的位置
int s=x[i++];
//一直向右前进知道距离s的距离大于R的点
while(i<n&&x[i]<=s+R) i++;
//p是新加上标记的点的位置
int p=x[i-1];
//一直向右前进直到距p的距离大于R的点
while(i<n&&x[i]<=p+R) i++;
ans++;
}
cout<<ans<<endl;
}
int main()
{
while(cin>>R>>n)
{
if (R==-1&&n==-1) break;
for(int i=0;i<n;i++)
{
cin>>x[i];
}
solve();
}
return 0;
}