码迷,mamicode.com
首页 > 其他好文 > 详细

01分数规划

时间:2019-09-21 17:27:51      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:分数   ons   challenge   std   clu   ase   while   www   51nod   

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;
}

 

01分数规划

标签:分数   ons   challenge   std   clu   ase   while   www   51nod   

原文地址:https://www.cnblogs.com/Profish/p/11563363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!