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
对于每组数据,输出最多可能砸到的苹果数。
#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; }