CodeForces Round #123 (195D) – Analyzing Polylin

來源:互聯網
上載者:User

     這道題一開始題目看錯了...理解了好久才知道題目意思..呃~~其實就是說這些折線疊加..會產生多少拐點...

     假設說題目給的是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 longusing 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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.