方伯伯浇水 - 算法题解:玉米田品质统计
方伯伯浇水 - 算法题解:玉米田品质统计/n/n### 题目描述/n/n方伯伯有一块玉米田,玉米田可以视为平面直角坐标系上横纵坐标在 $-10^5$ 至 $10^5$ 范围内(包括边界)的一片正方形区域。玉米田内的每个整点(横纵坐标均为整数的点)上都种着一株玉米。/n/n方伯伯连续 $m$ 天对玉米田进行浇水,每天他会选出一个圆心坐标为 $(x,y)$,半径为 $r$ 的圆形区域,对其中(不包括边界)的每株玉米浇一次水(如果圆形区域超过玉米田边界,超过部分无需浇水)。最开始所有玉米的品质都是 $1$,每次浇水会让该株玉米的品质增 $1$。/n/n$m$ 天过后,到了收获的季节,方伯伯想采用抽样检测的方式来调查玉米田的品质。方伯伯给出了 $10$ 株玉米的坐标,他想调查这 $10$ 株玉米品质的平均数。/n/n### 输入格式/n/n第一行输入一个正整数 $m$($m/le10^5$),代表浇水天数。/n接下来 $m$ 行,每行输入三个整数 $x_i,y_i$($-10^5/le x_i,y_i/le 10^5$)和 $r_i$($0<r_i/le10^5$),代表第 $i$ 天浇水的圆形区域。/n/n接下来 $10$ 行,每行输入两个整数 $x_i,y_i$($-10^5/le x_i,y_i/le 10^5$),代表收获季节调查的 $10$ 株玉米的坐标。/n/n### 输出格式/n/n输出一个数字(保留 $2$ 位小数),代表调查的这 $10$ 株玉米品质的平均数。/n/n### 样例 #1/n/n#### 样例输入 #1/n/n/n2/n3 4 5/n-1 0 1/n-1 0/n0 0/n1 0/n2 0/n3 0/n-1 -1/n0 -1/n1 -1/n2 -1/n3 -1/n/n/n#### 样例输出 #1/n/n/n1.40/n/n/n### 提示/n/n判断点 $(x_1,y_1)$ 与圆 $(x_0,y_0,r_0)$ 的方法是:/n/n计算点 $(x_1,y_1)$ 到圆心 $(x_0,y_0)$ 的距离的平方 $d^2=(x_1-x_0)^2+(y_1-y_0)^2$,将这个值与圆的半径的平方 $r_0^2$ 作比较:/n- 如果 $d^2<r_0^2$,说明点在圆内;/n- 如果 $d^2=r_0^2$,说明点在圆上;/n- 如果 $d^2>r_0^2$,说明点在圆外。/n/n### C++代码/n/nc++/n#include <iostream>/n#include <cmath>/nusing namespace std;/n/nint main() {/n int m, x, y, r;/n cin >> m;/n int quality[100005][100005] = {0}; // 用二维数组记录每个玉米的品质/n for (int i = 0; i < m; i++) {/n cin >> x >> y >> r;/n for (int j = x - r; j <= x + r; j++) {/n for (int k = y - r; k <= y + r; k++) {/n if ((j - x) * (j - x) + (k - y) * (k - y) < r * r) {/n quality[j + 50000][k + 50000]++; // 偏移数组下标,避免负数下标/n }/n }/n }/n }/n int sum = 0;/n for (int i = 0; i < 10; i++) {/n cin >> x >> y;/n sum += quality[x + 50000][y + 50000];/n }/n printf('%.2f/n', (double)sum / 10);/n return 0;/n}/n/n/n### 优化技巧/n/n- 使用二维数组记录每个玉米的品质,方便快速统计。/n- 偏移数组下标,避免负数下标,简化代码。/n- 可以使用循环优化,减少重复计算。/n/n### 总结/n/n本题是一道计算几何与模拟题,需要判断点是否在圆内,并根据判断结果更新玉米品质。通过二维数组记录品质,可以方便快速统计,使用循环优化可以提升代码效率。/n
原文地址: https://www.cveoy.top/t/topic/jCWd 著作权归作者所有。请勿转载和采集!