您的位置:首页 > 其它

POJ 3069 Saruman's Army(贪心、思维)

2016-04-04 22:23 260 查看
开始不再状态,没看下去题目,题意没了解,再看也没看懂,深刻认识到理解题意重要性!!

以后每次写题解都会写题目大意,毕竟人们做容易忘记最重要、最基础的。

题目大意:给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: