題名:
回答:
詳細な解決策については、こちらを参照してください。
ここにポイントがあります。epsは十分に小さい必要があります。1e-5から始めたとき、データの90%を通過し、1e-7を開くのに十分でした。
コード:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
}
double eps=1e-7;
const int maxn=1e5+9;
double a[maxn],b[maxn];
double dis[maxn];
int n,k;
bool check(double mid)
{
double ans=0;
for(int i=1;i<=n;i++)dis[i]=a[i]-mid*b[i];
sort(dis+1,dis+1+n,greater<double>());
for(int i=1;i<=k;i++)ans+=dis[i];
//for(int i=n;i>n-k;i--)ans+=dis[i];
if(ans>eps)return 0;
return 1;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
double l=0,r=1000;
while(r-l>eps)
{
double mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}
printf("%.4f",l);
return 0;
}
[POJ2976]ドロップテスト
この質問のコードを少し変更すればOKです。この質問はnkを選択することです。