9月22日 交匯的火力
阿新 • • 發佈:2018-09-23
坐標 得到 data pre target tput 接下來 nbsp span
n
k1 b1
k2 b2
.
kn bn
第一行一個數n,表示直線數量
接下來n行,每行描述一條直線
若交點不存在請輸出No Fire Point. (結尾有小點哦)
1 0
-1 2
但問題是會存在多個交點,所以我們需要去重 根據數學,我們可以推算出x=(k1-k2)/(b2-b1)得到 y坐標帶入就可以了,然後存入數組進行判斷
註意因為涉及有小數,所以要開double
代碼
題目
題目描述
小D正在玩CS,喜歡思考的他看到無數子彈從他眼前飛過時想到了一個奇怪的問題:這麽多子彈在空中飛來飛去,難道它們不會相撞嗎?當然這是可能的.小D把兩顆子彈軌跡相交的地方叫做”火力匯點”,顯然如果讓敵人站在火力匯點上那麽他將受到更嚴重的傷害.小D想知道平面上的所有火力匯點以便對敵人造成更重的打擊,但是小D數學很差,所以他找到了你,請你幫他計算出平面上所有火力匯點的坐標.小D用直線來描述子彈的軌跡,這種子彈很特別,它發射後會迸裂成兩顆並沿相反方向飛行(汗!!那不是打自己),小D數學很差(已知),只會用直線的一般式表示每條直線y=kx+b.輸入
k1 b1
k2 b2
.
kn bn
第一行一個數n,表示直線數量
接下來n行,每行描述一條直線
輸出
一個數,火力匯點的個數若交點不存在請輸出No Fire Point. (結尾有小點哦)
輸入樣例復制
21 0
-1 2
輸出樣例復制
1說明
[數據規模] 對所有數據k,b<=maxint n<=100 分析 我們知道,當k1==k2時就不會相交也不會平行,所以我們只需要求有多少個不同的而且不平行的線就可以了但問題是會存在多個交點,所以我們需要去重 根據數學,我們可以推算出x=(k1-k2)/(b2-b1)得到 y坐標帶入就可以了,然後存入數組進行判斷
1 #include<iostream> 2 using namespace std; 3 int ans; 4 double a[100001],b[100001],p[100001][3]; 5 int main () 6 { 7 int n; 8 cin>>n; 9 double x,y; 10 int sb=0; 11 for (int i=1;i<=n;i++) 12 cin>>a[i]>>b[i];13 for (int i=1;i<=n;i++) 14 for (int j=i+1;j<=n;j++) 15 { 16 if (a[i]==0&&a[j]==0) continue; 17 if (a[i]==a[j]) 18 continue; 19 double l=a[i]-a[j]; 20 double r=b[j]-b[i]; 21 x=r/l; 22 y=a[i]*x+b[i]; 23 int f=0; 24 for (int k=1;k<=sb;k++) 25 { 26 if (p[k][1]==x&&p[k][2]==y) 27 { 28 f=1; break; 29 } 30 } 31 if (f==0) 32 { 33 sb++; 34 p[sb][1]=x; 35 p[sb][2]=y; 36 ans++; 37 } 38 39 } 40 if (ans==0) 41 cout<<"No Fire Point."; 42 else 43 cout<<ans; 44 }
9月22日 交匯的火力