jzoj4230-淬炼神体【0/1分数规划】
生活随笔
收集整理的這篇文章主要介紹了
jzoj4230-淬炼神体【0/1分数规划】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目大意
nnn個東西,有ai,bia_i,b_iai?,bi?。選擇kkk個,使得∑ai/∑bi\sum a_i/\sum b_i∑ai?/∑bi?最大。
解題思路
∑ai/∑bi=k\sum a_i/\sum b_i=k∑ai?/∑bi?=k
∑ai/∑bi/k=1\sum a_i/\sum b_i/k=1∑ai?/∑bi?/k=1
∑ai/k=∑bi\sum a_i/k=\sum b_i∑ai?/k=∑bi?
那么
∑(ai/k?bi)>=0\sum (a_i/k-b_i)>=0∑(ai?/k?bi?)>=0
然后二分kkk就好了
然后每次選取ai/k?bia_i/k-b_iai?/k?bi?最大的kkk個就好了
codecodecode
#include<cstdio> #include<algorithm> using namespace std; const int N=100010; int n,k; double l,r,a[N],b[N],c[N]; bool check(double ks) {double ans=0;for(int i=1;i<=n;i++){c[i]=a[i]/ks-b[i];}sort(c+1,c+1+n);for(int i=n;i>=n-k+1;i--)ans+=c[i];return (ans>=0); } int main() {//freopen("data.in","r",stdin);//freopen("data.out","w",stdout);scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%lf",&a[i]);for(int j=1;j<=n;j++)scanf("%lf",&b[j]);l=1e-4;r=20000;while(r-l>1e-6){double mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}printf("%0.3lf",l); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的jzoj4230-淬炼神体【0/1分数规划】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信无法连接到服务器 你知道吗
- 下一篇: 0元起有效降低笔记本温度和风扇噪音怎么降