NC230965. 「Nhk R1 E」Welcome to The Cliff!
描述
输入描述
第一行三个整数 。
第二行 个整数,表示所有 C-points 的坐标。
第二行 个整数,表示所有 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; }