0w1

UVA 10382 Watering Grass ( 區間覆蓋問題 )

UVa Online Judge
用畢氏定理把輸入轉換成單純的區間覆蓋問題就可以了。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4 + 4;

int n;
double l, w;
double x[MAXN], r[MAXN];

typedef pair<double, double> pdd;
pdd p[MAXN];
void solve(){
    int m = 0;
    w /= 2.0;
    for(int i = 0; i < n; ++i){
        if( r[i] < w ) continue;
        double range = sqrt( r[i] * r[i] - w * w );
        p[ m++ ] = pdd( x[ i ] - range, x[ i ] + range );
    }
    sort( p, p + m );
    int rb = 0, cnt = 0;
    double pos = 0.0;
    while( pos < l ){
        int best_idx = -1;
        while( rb < m && p[ rb ].first <= pos ){
            if( best_idx < 0 || p[ rb ].second > p[ best_idx ].second )
                best_idx = rb;
            ++rb;
        }
        if( best_idx < 0 ) break;
        ++cnt;
        pos = p[ best_idx ].second;
    }
    if( pos < l ) puts("-1");
    else printf("%d\n", cnt);
}

int main(){
    while( scanf("%d%lf%lf", &n, &l, &w) == 3 ){
        for(int i = 0; i < n; ++i)
            scanf("%lf%lf", &x[i], &r[i]);
        solve();
    }
    return 0;
}