01分数规划

http://www.51nod.com/Challenge/Problem.html#problemId=1257

#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const double eps=1e-10;
const int maxn=4e5+8;
typedef long long LL;
typedef unsigned long long ULL;
const LL mod=1e9+7;
const ULL base=1e7+7;
const int maxp=26+5;
using namespace std;
int w[maxn],p[maxn];
pair<double,int> d[maxn];
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&w[i],&p[i]);
    }
    double l=0.0,r=50001.0;
    double mid;
    double sz;
    LL fz,fm;
    while(l+eps<=r){
        mid=(l+r)/2.0;
        sz=0.0;
        for(int i=1;i<=n;i++){
            d[i].fi=(double)p[i]-mid*w[i];
            d[i].se=i;
        }
        sort(d+1,d+1+n);
        for(int i=n;i>=n-k+1;i--){
            sz+=d[i].fi;
        }
        if(sz>=eps){
            fm=0;
            fz=0;
            for(int i=n;i>=n-k+1;i--){
                fm+=p[d[i].se];
                fz+=w[d[i].se];
            }
            l=mid;
        }
        else{
            r=mid;
        }
    }
    LL g=__gcd(fm,fz);
    fm/=g;
    fz/=g;
    cout<<fm<<'/'<<fz<<endl;
}
原文地址:https://www.cnblogs.com/Profish/p/11563363.html