3 16XJ模擬題 坦克

2021-07-25 14:25:40 字數 1495 閱讀 6218

你為了擊毀地方的坦克,使用了一種叫做雷射炮的**。

每輛坦克可以認為是二維平面內的乙個點(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);

}}