(紀中)2246. 恐怖分子(gun)

(File IO): input:gun.in output:gun.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet


題目描述
nn個恐怖分子在站在一個平面上,每個恐怖分子都有一個位置座標位置x,y)(x,y)。現在有一個激光武器要用來消滅這些恐怖分子,這個武器所在的位置是(x0,y0)(x0,y0),激光武器每發射一次,就可以消滅一條直線上的所有恐怖分子。現在,你的任務是計算最少要動用多少次激光武器,纔可以消滅所有的恐怖分子。


輸入
第一行是33個整數NNx0y0x0,y0,分別表示恐怖分子的數量和武器所在的位置。
接下來NN行,每行兩個整數表示每個恐怖分子的座標位置,恐怖分子可能站在相同的位置,但是不可能站在武器的位置上。

輸出
輸出最少需要使用激光武器的次數。


樣例輸入
樣例輸入1:
4 0 0
1 1
2 2
2 0
-1 -1

樣例輸入2:
2 1 2
1 1
1 0

樣例輸出
樣例輸出1:
2

樣例輸出2:
1

樣例1和樣例2的情況如圖在這裏插入圖片描述所示:


數據範圍限制
1<=N<=10001<=N<=1000,104<=x0,y0<=104-10^4<=x0,y0<=10^4,104<=x,y<=104-10^4<=x,y<=10^4


解題思路
以激光槍爲座標系原點,記錄每個恐怖分子的斜率,最後排個序就新了。。
OS:當恐怖分子座標橫座標=0時,因爲不能除以0,要將斜率設爲一個大數


代碼

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<map>
using namespace std;
int n,x,y,xx,yy,s,ans;
double a[1005];
int main()
{
   freopen("gun.in","r",stdin);
   freopen("gun.out","w",stdout);
   scanf("%d%d%d",&n,&x,&y);
   for(int i=1;i<=n;i++)
   {
   	scanf("%d%d",&xx,&yy);
   	if(x-xx==0)//如果恐怖分子橫座標=0
           a[++s]=100000;//將斜率設爲100000
       else
       a[++s]=(y-yy)*1.0/(x-xx);//斜率=以激光槍爲原點時的斜率
   } 
   sort(a+1,a+s+1);
   for(int i=2;i<=s;i++)
   {
   	if(a[i]!=a[i-1])//如果這個斜率與上個斜率不等
   	ans++;//再發一炮
   }
   printf("%d",ans+1);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章