题目的大意就是给出几队士兵,有好几堆(给出每堆士兵所在位置),现在要求出给最少的将军,将军可以管住士兵(有一个观察半径),在观察半径内的就可以满足条件(刚好在半径上也算是被管住)。
输入
观察半径r,和士兵的堆数n,(where 0 ≤ r≤ 1000)(1≤n≤1000)
Sample Input
0 3 10 20 20 10 7 70 30 1 7 15 20 50 -1 -1
Sample Output
2 4
看样子是个尺取贪心,但是这个贪心形式是个半径(圆的东西),这个怎么写代码呢?观摩大神代码,就是先贪一半(一个半径),然后再贪另一个半径,这样就可以将这个半径范围完美地表达出来了。代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<set>
using namespace std;
const int maxn=1000;
int a[maxn];
int main()
{
int r,n,i=0,k=0;
while(cin>>r>>n)
{
if(r==-1&&n==-1)
break;
memset(a,0,sizeof(a));
k=0;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
i=0;
while(i<n)
{
int zuozhi=a[i++];
while(i<n&&a[i]<=zuozhi+r)
i++;
int p=a[i-1];
while(i<n&&a[i]<=p+r)
i++;
k++;
}
cout<<k<<endl;
}
return 0;
}
两个while 一个是左边的半径(能到达的最大位置),另一个是右边半径(能到达的最大位置),最后放置将军。