今天主要是完成函数的实验。通过今天的实验,记录一个知识点,这里和大家分享。
以下是习题
这种问题的求法我们可以看做一个知识点,即尼克彻斯定理。
根据题目,我们只需要找到第一个奇数,就可以依次找到并输出之后连续的奇数。而第一个奇数为m*m-m+1,这点大家可以直接记住,如果想要探究原理,也可以去了解尼克彻斯定理。
接下来继续和大家分享一下做的习题(但是最后结果在测试时,只有部分数据能够符合条件,经过调试之后,目前暂时不知问题所在,明天会继续查找,然后和大家分享。今天就分享一下思路,把我自己写的代码给出来,大家也可以看看是哪里有问题。)
这道题的思路其实很简单,我们只需要将每个黑子的点都分别当做中心点,然后计算出中心点到其他点的距离,将最远的距离作为伞的半径,之所以这样是因为只有最远的距离试做半径,才能将所有黑子都覆盖掉。接下来就可以求出种情况的伞的面积,进行比较输出最小的面积,则是题目要求的答案。
以下是代码实现:
#include<stdio.h>
#include<math.h>
int main()
{
int n = 0;
scanf("%d", &n);
int x[1000];
int y[1000];
double dis;
double max = 0;
double s[1000];
int m = 0;
double min;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
for (int i = 0; i < n; i++)//每次都将其中一个点看做中心
{
for (int j = 0; j < n; j++)//求出该点分别到所有点的距离
{
dis = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) *( y[i] - y[j]));
if (dis > max)
max = dis;
}
s[m++] = max * max * 3.1415926535;
}
min = s[0];
for (int i = 1; i < m; i++)
{
if (s[i] < min)
min = s[i];
}
printf("%.4lf", min);
return 0;
}
这个代码在使用题目的样例时,能够正确输出,但是在平台的测试点运行错误。也分享和记录一下错误的其中一个例子,方便查找问题。(以下是非ac的输入与输出,我写的代码在这个数据的对应输出上运行错误,答案不为右下图的值)
感谢您的阅读,欢迎提出建议和指导