NC19964. [HAOI2006]聪明的猴子
描述
输入描述
第1行为一个整数,表示猴子的个数M(2 ≤ M ≤ 500);
第2行为M个整数,依次表示猴子的最大跳跃距离(每个整数值在1--1000之间);
第3行为一个整数表示树的总棵数N(2 ≤ N ≤ 1000);
第4行至第N+3行为N棵树的坐标(横纵坐标均为整数,范围为:-1000--1000)。(同一行的整数间用空格分开)
输出描述
包括一个整数,表示可以在这个地区的所有树冠上觅食的猴子数
示例1
输入:
4 1 2 3 4 6 0 0 1 0 1 2 -1 -1 -2 0 2 2
输出:
3
C++11(clang++ 3.9) 解法, 执行用时: 11ms, 内存消耗: 612K, 提交时间: 2019-10-31 18:13:55
#include<iostream> #include<cstdio> #include<iostream> #include<cmath> using namespace std; struct point {int x,y;} p[1005]; double dis(point a,point b) { int dx=a.x-b.x,dy=a.y-b.y; return sqrt(dx*dx+dy*dy); } int maxd[505],vis[1005]; double d[1005]; int main() { int n,m,ans=0,pos=0; double maxn=0; scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d",&maxd[i]); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y); for(int i=0;i<=n;i++) d[i]=1e8; d[1]=0; for(int i=1;i<=n;i++) { double minn=1e9; for(int u=1;u<=n;u++) if(!vis[u]&&d[u]<minn) { minn=d[u]; pos=u; } vis[pos]=true; maxn=max(maxn,minn); for(int u=1;u<=n;u++) d[u]=min(d[u],dis(p[u],p[pos])); } for(int i=1;i<=m;i++) if(maxd[i]>=maxn) ans++; printf("%d",ans); return 0; }