astar 月赛 第二题 Apple

Apple

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)

Problem Description

小H是一个程序员,但他的生活不局限在写程序。

有一天,他走到公园散步。他见到公园的一棵苹果树上结满了苹果。他于是拿起石头,想砸几个苹果下来当第二天的早餐。突然他思考到了一个问题:怎样才能一次砸到最多苹果?

我们考虑该局面是这样一个模型:所有东西位于二维笛卡尔坐标系,其中小H位于原点,苹果们分别在坐标系的整点上。石头飞出的轨迹是一条经过原点的抛物线,确切的说,经过的是 y=ax^2+bx 的抛物线(a<0)。石头砸到一个苹果后,该苹果会落下,且石头不会改变运动轨迹。

现在小H希望求扔一个石头最多砸到的苹果数。

Input

         第一行为一个整数T(1 <= T<= 10),表示有T组测试数据;

         每组数据第一行一个正整数N(1<=N<=2000),表示苹果数。下面N行每行两个整数给出每个苹果的坐标xi, yi(1<=xi<=1000, 1<=yi<=1000000)。

Output

         对于每组数据,输出最多可能砸到的苹果数。

Sample Input
2
4
1 3
2 4
3 3
4 4
2
1 1
1 1
 
Sample Output
3
2
 
 
代码<未测试>
View Code
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int t;
    int n;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&n);
        int j=0;
        int *x=(int *)malloc(n*sizeof(int));
        int *y=(int *)malloc(n*sizeof(int));
        for (j=0;j<n;j++)
        {
            scanf("%d%d",&x[j],&y[j]);
        }
        int **f=(int **)malloc(n*sizeof(int *));
        for (j=0;j<n;j++)
        {
            f[j]=(int *)malloc(n*sizeof(int));
        }
        int i=0;
        int max=1;
        for (i=0;i<n;i++)
        {
            for (j=i+1;j<n;j++)
            {
                //calc (i,j)代表的抛物线上的苹果树
                int sum=1;
                if(i==j )
                {
                    continue;
                }
                if ((x[i]==x[j])&&(y[i]==y[j]))
                {
                    sum++;
                    

                }
                else if(x[i]!=x[j])////calc (i,j)代表的抛物线上的苹果树
                {

                    
                    float a =( y[i]*x[j]-x[i]*y[j])/(float)(x[i]*x[j]*(x[i]-x[j])) ;
                    if(a>0) continue;
                    sum++ ;//找到一个可以形成抛物线的相异点
                    float b = y[i]/(float)x[i] - a * x[i];
                    int k=0;
                    for (k=0;k<n;k++)
                    {
                        if (k==i ||k==j ||(((x[i]==x[k])&&(y[i]==y[k]))))
                        {
                            continue;
                        }
                        else
                        {
                            if((int)(a * x[k]*x[k] + b * x[k])==y[k]) sum++;
                        }
                    }
                }
                if (sum>max) //renew
                {
                    max =sum;
                }

            }
        }
        printf("%d\n",max);

    }
    return 0;
}

                                                                                                                                                                                                                           

原文地址:https://www.cnblogs.com/easyFancy/p/3048161.html