(File IO): input:gun.in output:gun.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet
題目描述
有個恐怖分子在站在一個平面上,每個恐怖分子都有一個位置座標位置。現在有一個激光武器要用來消滅這些恐怖分子,這個武器所在的位置是,激光武器每發射一次,就可以消滅一條直線上的所有恐怖分子。現在,你的任務是計算最少要動用多少次激光武器,纔可以消滅所有的恐怖分子。
輸入
第一行是個整數和,分別表示恐怖分子的數量和武器所在的位置。
接下來行,每行兩個整數表示每個恐怖分子的座標位置,恐怖分子可能站在相同的位置,但是不可能站在武器的位置上。
輸出
輸出最少需要使用激光武器的次數。
樣例輸入
樣例輸入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的情況如圖所示:
數據範圍限制
,,。
解題思路
以激光槍爲座標系原點,記錄每個恐怖分子的斜率,最後排個序就新了。。
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);
}