列表

详情


NC230965. 「Nhk R1 E」Welcome to The Cliff!

描述


数轴上给出 a 个点 c_1,c_2...c_a,以及另外 b 个点 v_1, v_2,...v_b 和一个范围 ,保证

你可以选择一个实数 , 使得所有 ,你需要保证这样操作之后依然满足

f(i) 表示 c_i 到最近的 v 中的点的距离,你要选择合适的 ,在保证 的前提下,最大化 的值。

如果有多个可以选择的 ,请输出最大的那个。如果没有满足条件的 (即无论如何选择都无法满足 ),请输出 NO

输入描述

第一行三个整数 l,a,b

第二行 a 个整数,表示所有 C-points 的坐标。

第二行 b 个整数,表示所有 V-points 的坐标。

输出描述

若有符合条件的  , 输出一个实数,表示最大的 ,只要你的答案与标准答案相差不超过  即被认为是正确的。

若没有符合条件的  , 输出 NO。


示例1

输入:

6 4 5
0 0 2 4
0 1 2 3 5

输出:

1.000000

说明:

,所有坐标按升序排序且第一个 V-points 的坐标为 ,所有坐标在  中。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 556K, 提交时间: 2022-01-16 11:28:26

#include<bits/stdc++.h>
#include <iostream>
#include <fstream>
using namespace std;
using cd=complex<double>;
#define fi first
#define PI acos(-1)
#define se second
#define eps 1e-20
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define HP(x) cout<<fixed<<setprecision(x);
#define popcnt(x) __builtin_popcountll(x)
typedef long long ll;
typedef string str;
typedef long double db;
typedef pair<ll,ll> pll;
typedef pair<db,db> pdd;
typedef pair<int,int> pii;
typedef pair<pll,pll> pp;
mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count());//rnd()%n,shuffle(a+1,a+1+n,rnd);
const ll N=1005;
ll l,n,m,a[N],b[N],c[N];
vector<pll> p;
int main(){
    IOS;cin>>l>>n>>m;l*=2;HP(10);
    for(ll i=1;i<=n;i++){
        cin>>a[i];a[i]*=2;
    }
    for(ll i=1;i<=m;i++){
        cin>>b[i];b[i]*=2;
    }
    for(ll i=2;i<=m;i++){
        c[i]=(b[i-1]+b[i])/2;
    }
    ll R=l-b[m],sum=0,K=0,pre=0,mx=-1;db ans=-1;
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            if(a[i]>=b[j]&&a[i]-b[j]<=R){
                p.push_back({a[i]-b[j],0});
            }
        }
        for(ll j=2;j<=m;j++){
            if(a[i]>=c[j]&&a[i]-c[j]<=R){
                p.push_back({a[i]-c[j],1});
            }
        }
    }
    p.push_back({R,0});
    sort(p.begin(),p.end());
    for(ll i=1;i<=n;i++){
        ll mi=2e18,pos=-1;
        for(ll j=1;j<=m;j++){
            ll v=abs(a[i]-b[j]);
            if(v<mi) mi=v,pos=j;
        }
        if(a[i]>b[pos]) K--;
        else K++;sum+=mi;
    }
    if(sum<=l) mx=sum,ans=0;
    for(auto i:p){
        ll v=i.fi-pre;
        if(sum>=l&&sum+v*K<=l){
            mx=l;ans=pre+(db)(sum-l)/(db)K;
        }
        if(sum<=l&&sum+v*K>=l){
            mx=l;ans=pre+(db)(l-sum)/(db)K;
        }
        sum+=v*K;pre=i.fi;
        if(sum<=l&&mx<=sum) mx=sum,ans=pre;
        if(i.se==0) K+=2;
        if(i.se==1) K-=2;
    }
    if(mx==-1) cout<<"NO"<<endl;
    else cout<<ans/2.0<<endl;
}

上一题