1. 程式人生 > >BZOJ 1610 Usaco Line

BZOJ 1610 Usaco Line

name == bsp algo logs %d 技術分享 code zoj

一道很水的題目,一開始用Set做。莫名其妙WA了,後來想了想。
精度問題很關鍵!!!

Set AC寫法

技術分享
#include <cstdio>
#include <algorithm>
#include <set>
 
using namespace std;
 
 
int n,tot;
double x[233],y[233];
double k,eps=1e-10;
 
struct CMP{
    inline bool operator()(const double x,const double y)const{
        
return x>eps+y; } }; set<double,CMP>s; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf%lf",&x[i],&y[i]); } for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ double fy = y[i] - y[j];
double fx = x[i] - x[j]; if(fx==0) s.insert(99999999); else s.insert(fy/fx); } } printf("%d\n",s.size()); return 0; }
Set

Sort AC寫法

技術分享
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
 
 
int
n,tot=1,pos; int x[202],y[202]; double k[200005]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&x[i],&y[i]); } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ double fy = y[i] - y[j]; double fx = x[i] - x[j]; if(fy==0) k[++pos] = 0; else if(fx==0) k[++pos]=1000000; else k[++pos] = fy/fx; } } std::sort(k+1,k+pos+1); for(int i=2;i<=pos;i++){ if( fabs(k[i]-k[i-1]) > 1e-10) tot++; } printf("%d\n",tot); return 0; }
Sort

BZOJ 1610 Usaco Line