开始不再状态,没看下去题目,题意没了解,再看也没看懂,深刻认识到理解题意重要性!!
以后每次写题解都会写题目大意,毕竟人们做容易忘记最重要、最基础的。
题目大意:给你n个据点,让你建立哨点,让每个哨兵的控制范围在r内,而且用最少的哨点控制所有据点。
思路:
要确定每一个哨点:先说第一个哨点,哨点必须能够控制第一个据点,它的控制范围和下一个哨点的控制范围必须要能将第二个据点覆盖。
然后类推,每个哨点和 前一个哨点 和 后一个哨点必须将先相应的据点控制,这个题目是考察思维的,虽然也有点贪心的意思。
核心代码:
while(i<n)
{
int up=a[i++];
//向右查询符合控制范围的哨点
while(i<n&&a[i]<=up+r)
i++;
int newup=a[i-1];
//从这个哨点找它对下一个的控制范围
while(i<n&&a[i]<=newup+r)
i++;
ans++;//成功建立哨点
}
完整代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int r,n,a[1005];
while(cin>>r>>n&&(r!=-1||n!=-1))
{
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int i=0,ans=0;//用来计数符合条件的哨点
while(i<n)
{
int up=a[i++];
//向右查询符合控制范围的哨点
while(i<n&&a[i]<=up+r)
i++;
int newup=a[i-1];
//从这个哨点找它对下一个的控制范围
while(i<n&&a[i]<=newup+r)
i++;
ans++;//成功建立哨点
}
cout<<ans<<endl;
}
return 0;
}