CodeForces Round #123 (195D) - Analyzing Polylin

     这道题一开始题目看错了...理解了好久才知道题目意思..呃~~其实就是说这些折线叠加..会产生多少拐点...

     假设说题目给的是n条直线..叠加以后只会是1条直线...但是当叠加的不是直线而是折线时..叠加出来的就会有很多拐点...易得n条折线叠加..会得到一条有<=n个拐点的直线..根据题目要求..而这个<=的出现有两种可能: 1、 有折线拐点相同..那么自然叠加一起只会体现出这一个共同的拐点. 2 、通过叠加拐点纠为了180度

     回到题目中来..题目中所有的折线都是在y=0上拐..也就是x轴上..那么要看叠加起来有多少个拐点..就看这些折线的拐点集合有多大..对于每条折线..令y=0很容易求出x=b/k..对于k=0的情况..直接跳过..因为其只会使叠加的折线平行于x轴平移而不会改变形状...将这些拐点存起来..排序后判断有多少个不同的拐点就是答案了..这里由于所有的折线都是在x轴上方..因此不会出现叠加出来的拐点被纠回了180度的情况.

      submit结果WA了...调高精度..过了一半的点..还是WA...精度到1e-50还不行..估计是double已经承受不了这个精度了..去瞄了下别人的AC代码..发现要用long double才行..这个第一次用...很eggache啊...


program:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#define oo 2000000000
#define ll long long
using namespace std;  
int n;
long double a[100005];
int main()
{   
       cin>>n;
       int i,m=0,ans;
       double b,k;
       for (i=1;i<=n;i++) 
       {
              cin>>k>>b;
              if (k!=0) a[++m]=-(b/k);
       }
       sort(a+1,a+1+m);
       
       ans=0;
       for (i=2;i<=m;i++) 
          if (fabs(a[i]-a[i-1])>1e-50) ans++;
       if (m) ans++;
       cout<<ans<<endl;
       return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值