lightoj 1383 - Underwater Snipers

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <map>
#define LL long long
#define DB double


using namespace std;
const int N = 10009;
const int INF = 0x3f3f3f3f;
struct cpoint{
    int x,y;
    void get(){scanf("%d%d",&x,&y);}
} gd[N];
int k,n,s,d;
struct nod{
    int l,r;
    bool operator<(const nod t)const
    {
        return r<t.r||(r==t.r&&l<t.l);
    }
} re[N];
bool ok(int dis)
{
    //cout<<dis<<endl;
    for(int i=0;i<n;i++)
    {
        int d1 = gd[i].y-k+dis;
        if(d<d1) return false;
        int c = (int)sqrt(1.0*d*d-1.0*d1*d1);
        re[i].l = gd[i].x - c;
        re[i].r = gd[i].x + c;
    }
    sort(re,re+n);
    int ans = 1 ;
    int r = re[0].r;
    for(int i=1;i<n;i++)
    {
        if(re[i].l>r)
        {
            ans++;
            r = re[i].r;
        }
    }
    return ans<=s;
}
int solve()
{
    int ret=-1;
    int l = 0,r = INF,mid;
    while(l<=r)
    {
        mid = (l+r)>>1;
        if(ok(mid))
        {
            ret = mid;
            l = mid+1;
        }else
        r = mid-1;
    }return ret;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    int cas,T=1;scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d%d%d",&k,&n,&s,&d);
        for(int i=0;i<n;i++)
        gd[i].get();
        int ans = solve();
        printf("Case %d: ",T++);
        if(ans<=0) printf("impossible\n");
        else printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(二分,贪心,计算几何,lightoj)