FZU OJ 2140 Forever 0.5 (几何)

时间:2023-02-10 19:15:53
Problem 2140 Forever 0.5

Accept: 269    Submit: 934    Special Judge
Time Limit: 1000 mSec    Memory Limit : 32768 KB

FZU OJ 2140 Forever 0.5 (几何) Problem Description

Given an integer N, your task is to judge whether there exist N points in the plane such that satisfy the following conditions:

1. The distance between any two points is no greater than 1.0.

2. The distance between any point and the origin (0,0) is no greater than 1.0.

3. There are exactly N pairs of the points that their distance is exactly 1.0.

4. The area of the convex hull constituted by these N points is no less than 0.5.

5. The area of the convex hull constituted by these N points is no greater than 0.75.

FZU OJ 2140 Forever 0.5 (几何) Input

The first line of the date is an integer T, which is the number of the text cases.

Then T cases follow, each contains an integer N described above.

1 <= T <= 100, 1 <= N <= 100

FZU OJ 2140 Forever 0.5 (几何) Output

For each case, output “Yes” if this kind of set of points exists, then output N lines described these N points with its coordinate. Make true that each coordinate of your output should be a real number with AT MOST 6 digits after decimal point.

Your answer will be accepted if your absolute error for each number is no more than 10-4.

Otherwise just output “No”.

See the sample input and output for more details.

FZU OJ 2140 Forever 0.5 (几何) Sample Input

3235

FZU OJ 2140 Forever 0.5 (几何) Sample Output

NoNoYes0.000000 0.525731-0.500000 0.162460-0.309017 -0.4253250.309017 -0.4253250.500000 0.162460

开始半天没有读懂题意,以为这道题挺复杂的,后来读懂了一点,原来也是比较水,有一点技巧。

题意:给你n个点,这n个点是否满足下面的条件。

1.两点之间的距离不大于1

2.任意点到原点的距离不大于1

3.有n对点的距离刚好等于1

4.n个点构成的n边形的面积不小于0.5

5.n个点构成的n边形的面积不大于0.75

如果满足关系就输出yes + 这n个点,没有就输出 no。

思路:画个图可以进行推敲一下,前四个点基本上都是确定的。3个点就是一个等边三角形,(原点,x=1,y=0)但是面积不符合,所以满足条件至少需要4个点,其实就是一个半径为1的圆以原点为圆心。然后以原点和x轴画一个边长为1的等边三角形,这样的话就有三个点了,然后剩下的点从圆上找就可以了,主要是离那三个点的距离大于1即可,因为圆上的点到圆心的距离都为1,其实就是将圆离散化。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
double x[110],y[110];
const double temp=0.001;
void solve()
{
    x[0]=0,y[0]=0;//原点
    x[1]=1,y[1]=0;//第二个点
    x[2]=0.5,y[2]=sqrt(1-0.25);//等边三角形的三个点 
    x[3]=0.5,y[3]=y[2]-1;
    for(int i=4;i<110;i++)
    {
        y[i]=i*temp;//离散化
        x[i]=sqrt(1-y[i]*y[i]);
    }
}
int main()
{
    int t,n;
    solve();
    cin>>t;
    while(t--)
    {
        cin>>n;
        if(n<4)
            printf("No\n");
        else
        {
            printf("Yes\n");
            for(int i=0;i<n;i++)
              printf("%.6lf %.6lf\n",y[i],x[i]);
        }
    }
    return 0;
}