简单算法 集合的巧用

题目:

There are n Imperial stormtroopers on the field. The battle field is a plane with Cartesian coordinate system. Each stormtrooper is associated with his coordinates (x, y) on this plane.

Han Solo has the newest duplex lazer gun to fight these stormtroopers. It is situated at the point (x0, y0). In one shot it can can destroy all the stormtroopers, situated on some line that crosses point (x0, y0).

Your task is to determine what minimum number of shots Han Solo needs to defeat all the stormtroopers.

The gun is the newest invention, it shoots very quickly and even after a very large number of shots the stormtroopers don't have enough time to realize what's happening and change their location.

Input
The first line contains three integers n, x0 и y0 (1 ≤ n ≤ 1000,  - 104 ≤ x0, y0 ≤ 104) — the number of stormtroopers on the battle field and the coordinates of your gun.

Next n lines contain two integers each xi, yi ( - 104 ≤ xi, yi ≤ 104) — the coordinates of the stormtroopers on the battlefield. It is guaranteed that no stormtrooper stands at the same point with the gun. Multiple stormtroopers can stand at the same point.

Output
Print a single integer — the minimum number of shots Han Solo needs to destroy all the stormtroopers.

解答:首先呢,说了很多废话!题目大概意思就是先输入一个n,然后输入初始坐标(x,y);再输入n个坐标(x0,y0)
如以下:

3 0 0
1 0 
2 0 
3 0

然后求经过初始坐标的一条直线同时经过一些点,问?用多少条线穿过所有点(其实就是斜率的集合)
程序如下:

	#include"stdio.h"
	#include"set"
	#include"iostream"
	using namespace std;
	int main()
	{
		int n;
		int x,y;
		while(~scanf("%d %d %d",&n,&x,&y))
		{
			int a[1006][2];
			set<double>bb;
			int c=0;
			for(int i=0;i<n;i++)
			{
				scanf("%d %d",&a[i][0],&a[i][1]);//用数组保存所有坐标,我知道可以省略,为了普及多个知识点而已
			}
			for(int i=0;i<n;i++)//再调出所有数据查询
			{
				if(a[i][0]====x)
				{
					c=1;//这是斜率不存在的情况下
				} 
				if(a[i][0]!=x)//斜率存在情况下用集合储存所有的斜率
				{
					double number=(double)(a[i][1]-y)/(a[i][0]-x);//为什么加double ?可以下面告诉我,我知道很基础但	是容易漏写
					bb.insert(number);	//和上面一步操作连起来储存集合值进入bb;insert插入函数
				} 
			}//创建的集合值都是排好序的;
			int e=bb.size();这一步骤求集合的长度,
			if(c===1)
			e++;
			printf("%d\n",e);
		}
	}//以上头文件有多出来的没有使用到,习惯而已,这是c++和c兼容的编译器通过的程序,如c-free5;

题目很简单,就是集合巧用。抓住斜率,就这样。加油?????~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值