方伯伯浇水 - 优化玉米田品质平均数计算

方伯伯有一块玉米田,玉米田可以视为平面直角坐标系上横纵坐标在 -10⁵ 至 10⁵ 范围内(包括边界)的一片正方形区域。玉米田内的每个整点(横纵坐标均为整数的点)上都种着一株玉米。

方伯伯连续 m 天对玉米田进行浇水,每天他会选出一个圆心坐标为 (x, y),半径为 r 的圆形区域,对其中(不包括边界)的每株玉米浇一次水(如果圆形区域超过玉米田边界,超过部分无需浇水)。最开始所有玉米的品质都是 1,每次浇水会让该株玉米的品质增 1。

m 天过后,到了收获的季节,方伯伯想采用抽样检测的方式来调查玉米田的品质。方伯伯给出了 10 株玉米的坐标,他想调查这 10 株玉米品质的平均数。

输入格式

第一行输入一个正整数 m(m≤10⁵),代表浇水天数。 接下来 m 行,每行输入三个整数 xᵢ, yᵢ(-10⁵≤xᵢ, yᵢ≤10⁵)和 rᵢ(0<rᵢ≤10⁵),代表第 i 天浇水的圆形区域。

接下来 10 行,每行输入两个整数 xᵢ, yᵢ(-10⁵≤xᵢ, yᵢ≤10⁵),代表收获季节调查的 10 株玉米的坐标。

输出格式

输出一个数字(保留 2 位小数),代表调查的这 10 株玉米品质的平均数。

样例 #1

样例输入 #1

2
3 4 5
-1 0 1
-1 0
0 0
1 0
2 0
3 0
-1 -1
0 -1
1 -1
2 -1
3 -1

样例输出 #1

1.40

提示

判断点 (x₁, y₁) 与圆 (x₀, y₀, r₀) 的方法是:

计算点 (x₁, y₁) 到圆心 (x₀, y₀) 的距离的平方 d²=(x₁-x₀)²+(y₁-y₀)²,将这个值与圆的半径的平方 r₀² 作比较:

  • 如果 d²<r₀²,说明点在圆内;
  • 如果 d²=r₀²,说明点在圆上;
  • 如果 d²>r₀²,说明点在圆外。

C++ 代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int N=1e5+20;
int x[N],y[N],r[N];
int a[20],b[20];
int z[20],n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        cin>>x[i]>>y[i]>>r[i];
    for(int i=1;i<=10;i++)
    {
        cin>>a[i]>>b[i];
        z[i]=1;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=10;j++)
            if (((a[j]-x[i])*(a[j]-x[i]) + (b[j]-y[i])*(b[j]-y[i])) < (r[i]*r[i])) // 优化:提前判断距离平方是否小于半径平方
            {
                z[j]++;
            }
    }
    int ans=0;
    for(int i=1;i<=10;i++) ans+=z[i];
    printf("%.2lf",(double)ans/10.0);
    return 0;
}

代码优化

  1. 提前判断距离平方是否小于半径平方:在循环中判断点是否在圆内时,可以先计算距离平方,如果距离平方已经大于半径平方,则可以直接跳过该点的判断,避免不必要的计算。

  2. 使用更简洁的判断语句:使用 if (((a[j]-x[i])*(a[j]-x[i]) + (b[j]-y[i])*(b[j]-y[i])) < (r[i]*r[i])) 代替 if (sqrt((a[j]-x[i])*(a[j]-x[i]) + (b[j]-y[i])*(b[j]-y[i])) < r[i]) 可以避免计算平方根,提高效率。

  3. 使用更合理的变量名:使用 x[i], y[i], r[i] 等更具描述性的变量名可以提高代码可读性。

通过以上优化,代码效率会得到提升,同时也更加易于理解和维护。

注意: 本文仅提供代码示例,建议您根据具体情况进行调整和优化。

方伯伯浇水 - 优化玉米田品质平均数计算

原文地址: https://www.cveoy.top/t/topic/jCZu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录