链接
题意:
题解:
详细解法看这里
这里说个点,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]Dropping tests
这个题的话稍微改改代码就OK了,这个题是选n-k个