poj3069(贪心)
来源:互联网 发布:proteus isis仿真软件 编辑:程序博客网 时间:2024/05/19 04:02
题目
题意:有n个点,给你一个R,要标记一些点,要求标记的点左右R距离内必须有被标记的点,且标记点数最小。求有多少点被标记。
题解:较为简单的贪心,直接枚举最左端点寻找R距离内的中心作为标记点然后再去找右端点,扫一遍就好了。
(小白上的题目,我的代码和小白代码都贴上。)
我的代码
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int a[1005],vis[1005];int main(){ int r,n; while (~scanf("%d %d",&r,&n)) { if(r == n && r == -1) { break; } memset(vis,0,sizeof vis); memset(a,0,sizeof a); for (int i = 0; i < n; i++) { scanf("%d",&a[i]); } a[n] = 3000; n++; sort(a,a+n); int flag = 0,left,right,ans = 0; for (int i = 0; i < n; i++) { if(vis[i] == 0 && flag == 0) { left = a[i]; flag = 1; } if(left + r >= a[i] &&left + r < a[i + 1]) { vis[i] = 1; flag = 2; } if(flag == 2 && vis[i]) { right = a[i]; } if(a[i] - r <= right && a[i+1] - r > right) { flag = 0; } } for (int i = 0 ; i < n; i++) { if(vis[i]) ans++; } printf("%d\n",ans); }}
小白代码:
#include<bits/stdc++.h>using namespace std;const int MAX_N = 1005;int N,R;int X[MAX_N];void solve(){ int i = 0,ans = 0; while (i < N){ // s是没有被覆盖的最左的点的位置 int s = X[i++]; //一直向右前进知道距s的距离大于R的点 while (i < N && X[i] <= s + R) i++; //p是先加上标记的点的位置 int p = X[i - 1]; //一直向右前进直到距p的距离大于R的点 while (i < N && X[i] <= p + R) i++; ans++; } printf("%d\n",ans);}
阅读全文
0 0
- poj3069(贪心)
- POJ3069(贪心)
- poj3069(贪心)
- 贪心--poj3069
- POJ3069(贪心)
- poj3069贪心
- poj3069 贪心
- poj3069(贪心)
- poj3069贪心
- 贪心POJ3069
- poj3069贪心
- POJ3069 Saruman's Army Greedy(贪心)
- poj3069 Saruman's Army (贪心)
- poj3069 Saruman's Army(贪心,水)
- poj3069 Saruman's Army(经典贪心)
- POJ3069 Saruman's Army(贪心)
- poj3069贪心、思想、技巧
- poj3069简单贪心
- JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
- Scala 中当方法不需要接受参数时可定义成两种类型的方法
- caffe-pycaffe
- 设计模式--观察者模式
- 51NOD 1188 数学
- poj3069(贪心)
- Java修饰符访问权限_动力节点Java学院整理
- 机房---宏观把控
- Spring,JOTM,Mybatis多数据源动态配置和使用
- SSH整合
- 负载均衡之权重轮询调度算法
- 使用jsp作为视图模板&常规部署
- BZOJ 1003 [ZJOI2006]物流运输 SPFA+动态规划
- 欢迎使用CSDN-markdown编辑器