标签:
代码:
#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; }
标签:
原文地址:http://blog.csdn.net/bao_libra/article/details/45540561