你為了擊毀地方的坦克,使用了一種叫做雷射炮的**。
每輛坦克可以認為是二維平面內的乙個點(xi,yi),各有速度:每秒位移是(vxi,vyi)。從0時刻開始,你可以在0時刻之後的任何乙個整數時刻在任意位置任意方向開啟你的雷射炮,你的雷射炮可以摧毀當前時刻某一直線上的所有坦克。
任何兩輛坦克在移動過程中都不會相互影響,即使他們重合了。
你的目標是摧毀盡量多的坦克,現在請你計算出最多能摧毀多少坦克。
有多組測試資料,每組測試資料第一行乙個正整數n表示坦克數目,接下來n行每行四個整數xi, yi, vxi, vyi如題意所述。最後以0結束。
每組測試資料輸出一行,乙個正整數表示最多摧毀的坦克數目。
4
9 9 -1 -1
4 1 3 6
1 8 6 -1
1 3 1 4
0對於20%的資料,n ≤ 20
對於100%的資料,約有20組資料, 1 ≤ n ≤ 100
其他數在longint範圍內。
這題看似o(
n4∗數
據組數)
的複雜度過不去,但是實際上應該是可以的
首先,列舉三個數,可以確定一條直線
你會問,說好的兩點確定一條直線呢?
因為它有時間這個限制,所以兩點確定的直線在時間不同時會不同
那麼列舉的這三個數就要通過解方程得到這條直線的時間
它可能是乙個二次方程,也可能是乙個一次方程,也可能有無數解,也可能無解,都要分別判斷
這部分需要你手推一下方程,你會發現非常非常的長
然後構出一條直線並判斷有多少個點在這條直線上就行了
這條直線有兩種形式,一種是y=
kx+b
,另一種是y=
a 又要分別判斷
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define n 111
#define db double
using namespace std;
intx[n],y[n],vx[n],vy[n],n,cs,ans;
db x1,x2;
void pd(int i,int j,int k)
x1=-c/b;
return;
}db dt=b*b-4
*a*c;
if (dt<0) return;
dt=sqrt(dt);
x1=(-b+dt)/2/a;x2=(-b-dt)/2/a;
}void work(int t,int i,int j)
else
ans=max(ans,an);
}int main()}}
printf("%d\n",ans);
scanf("%d",&n);
}}