代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
struct fun
{
int l;//区间左边
int r;//区间右边
int x;//输入的点
}a[1100];
int ans;
int n, r;
bool cmp(struct fun a, struct fun b)//自定义比较函数,按区间左边从小到大排序
{
return a.l<b.l;
}
int main()
{
while(~scanf("%d %d",&r, &n) && r != -1 && n != -1) {
for(int i = 0; i < n; i++) {
scanf("%d", &a[i].x);
}
for(int i = 0; i < n; i++) {
a[i].l = a[i].x-r;
a[i].r = a[i].x+r;
}
sort(a, a + n, cmp);
int l, r;
ans = 1; l = a[0].x, r = a[0].r;
for(int i = 1;i < n; i++) {
if(a[i].l <= l)
r = a[i].r;
else if(r < a[i].x) {
ans++;
l = a[i].x;
r = a[i].r;
}
}
cout<< ans <<endl;
}
return 0;
}
代码2:
下面这个代码复制一个大牛的.
/*
* 主要是考察贪心算法,首先,对数据进行升序排序,然后,使用贪心算法解决此问题,得到最后的结果。
*/
#include <iostream>
#include <algorithm>
using namespace std;
int solve(int a[], int n,int r)
{
int ans = 0,i = 0;
sort(a,a+n); // 将数组升序
while(i < n)
{
int s = a[i++]; // 一直向右前进直到距s的距离大于r的距离的点
while(i < n&&a[i] <= s + r) i++;
int k = a[i-1]; // 一直向右前进直到距k的距离大于r的距离的点
while(i < n&&a[i] <= k + r) i++;
ans++;
}
return ans;
}
int main(void)
{
int n,m;
while(cin>> n >> m,~n&&~m)
{
int a[m];
for(int i = 0; i != m; ++i)
{
cin >> a[i];
}
cout << solve(a,m,n) << endl;
}
return 0;
}