问题描述:
As Valeric and Valerko were watching one of the last Euro Championship games in a sports bar, they broke a mug. Of course, the guys paid for it but the barman said that he will let them watch football in his bar only if they help his son complete a programming task. The task goes like that.
Let's consider a set of functions of the following form:
Valeric and Valerko really want to watch the next Euro Championship game, so they asked you to help them.
InputThe first line contains integer n (1 ≤ n ≤ 105) — the number of functions. Each of the following n lines contains two space-separated integer
numbers ki, bi ( - 109 ≤ ki, bi ≤ 109) that determine the i-th function.
Output
Print a single number — the number of angles that do not equal 180 degrees in the graph of the polyline that equals the sum of the given functions.
1 1 0
1
3 1 0 0 2 -1 1
2
3 -2 -4 1 7 -5 1
3
题目分析:我们假象y(x)不是那样定义的,它就是简单的一次函数,那么n个一次函数相加肯定是一次函数,都是180°的倾角(直的),那么问题就出现在y(x)<0时,y(x)=0,也就是它本身应该加上一个小于0的数结果加上0了,所以就会有弯曲。
也就是记录与x轴有多少不同的交点
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
set<long double> M;
int main()
{
M.clear();
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++) {
ll k,b;
scanf("%lld%lld",&k,&b);
if (k==0) continue;
else {
long double ans=-(long double)b/k;
if (M.count(ans)==0) M.insert(ans);
}
}
printf("%d\n",M.size());
return 0;
}