zoukankan      html  css  js  c++  java
  • 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;
    }

                                                                                                                                                                                                                               

  • 相关阅读:
    POJ 1228 Grandpa's Estate | 凸包
    POJ 2187 Beauty Contest | 旋转卡壳
    POJ 3348 Cows | 凸包模板题
    POJ 1375 Intervals | 解析几何
    POJ 2074 | 线段相交
    POJ 1039 Pipe | 线段相交
    POJ 3304 Segments | 线段相交
    POJ 2318 TOYS | 二分+判断点在多边形内
    jpg、jpeg、png... 的区别
    xhr.readyState就绪状态
  • 原文地址:https://www.cnblogs.com/easyFancy/p/3048161.html
Copyright © 2011-2022 走看看