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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值