POJ 3069 Saruman's Army(贪心、思维)
2016-04-04 22:23
260 查看
开始不再状态,没看下去题目,题意没了解,再看也没看懂,深刻认识到理解题意重要性!!
以后每次写题解都会写题目大意,毕竟人们做容易忘记最重要、最基础的。
题目大意:给你n个据点,让你建立哨点,让每个哨兵的控制范围在r内,而且用最少的哨点控制所有据点。
思路:
要确定每一个哨点:先说第一个哨点,哨点必须能够控制第一个据点,它的控制范围和下一个哨点的控制范围必须要能将第二个据点覆盖。
然后类推,每个哨点和 前一个哨点 和 后一个哨点必须将先相应的据点控制,这个题目是考察思维的,虽然也有点贪心的意思。
核心代码:
以后每次写题解都会写题目大意,毕竟人们做容易忘记最重要、最基础的。
题目大意:给你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;
}
相关文章推荐
- 学习四:高级查询语句
- c/c++实现简单计算器
- Spring MVC 学习
- Android编程学习笔记 之 File数据存储
- java之GUI文件对话框javax.swing.JFileChooser
- 自定义ClassLoader类
- 工具-VS使用GIT工具
- python递归函数下不能正常使用yield
- 【FLUENT案例】02:DPM模型
- c++智能指针的不断演化
- Newtonsoft.Json 自定义序列化特性
- python中的元组
- JavaScript进阶基础一
- 分层嵌套的登录
- CocoaPods 使用方法介绍
- Sql学习第四天——SQL关于with cube,with rollup和grouping
- Java中Static调用问题
- android基础部分再学习---android处理运行时配置发生变化
- select系统调用 -- 文件描述符就绪条件
- 构建之法读后感01