首页 > 其他分享 >01分数规划

01分数规划

时间:2024-01-17 20:00:18浏览次数:30  
标签:分数 cnt 01 frac int sum ge include 规划

01分数规划

有\(n\)个物品,每个物品有两个权值\(a_{i}\),\(b_{i}\),现在要去掉\(k\)个 物品,使得剩下的\(n-k\)个物品 \(\frac{\sum a_{i}}{\sum b_{i}}\)

有最大值,并求出该最大值。

\(\frac{\sum a_{i}}{\sum b_{i}}\) = \(\frac{\sum a_{i} * w_{i}}{\sum b_{i} * w_{i}}\) (\(w_{i}\) = 0 / 1 表示物品是否选择) \(\ge\) \(X\)

\(\sum a_{i} * w_{i}\) - \(X\) * \(\sum b_{i} * w_{i}\) \(\ge\) \(0\)

\(\sum w_{i}\) * (\(a_{i}\) - \(X\) * \(b_{i}\)) \(\ge\) \(0\)

将 \(a_{i}\) - \(X\) * \(b_{i}\) 看作物品的新权值,按照权值大小排序,将 $n - k $个加和 看是否 \(\ge\) \(0\)

现在只需要找到 最大的\(X\) 使不等式成立 ,

二分答案 ! 找到 \(X\) 的二分区间!

[放弃测试](234. 放弃测试 - AcWing题库)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e3 + 50;
int n,k;
int a[N],b[N];
double c[N];
bool check(double x) 
{
    for(int i = 1;  i <= n; i++) 
    c[i] = a[i] - x * b[i];
    sort(c+1,c+n+1);
    double ans = 0;
    for(int i = k + 1; i <= n; i ++)  ans += c[i];
    if(ans < 0) return false;
    else return true;
}
int main()
{
    while(1) {
        scanf("%d%d",&n,&k);
        if(n == 0 && k == 0) break;
        for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
        for(int i = 1; i <= n; i++) scanf("%d",&b[i]);
        double l = 0, r = 1;
        while(l + 1e-5 < r)
        {
            double mid = (l + r) / 2;
            if(check(mid) == true) l = mid;
            else r = mid;
        }
        printf("%.0lf\n",r * 100);
    }
    return 0;
}

[观光奶牛](361. 观光奶牛 - AcWing题库)

有向图环-> SPFA

\(\frac{\sum f_{i}}{\sum t_{i}}\) = \(\frac{\sum f_{i} * w_{i}}{\sum t_{i} * w_{i}}\) \(\ge\) \(X\)

\(\sum w_{i} * (f_{i} - X * t_{i}) \ge 0\)
\(\sum w_{i} * (X * t_{i} - f_{i}) \le 0\)
令 新边权 为 \(X * t_{i} - f_{i}\) 跑一遍 SPFA 看看 有没有 负环
由于不清楚有向图的起点和连通性,每个点都要 跑一遍,以防错漏负环

#include <iostream>
#include <cstdio>
#include <queue>
using  namespace std;
const int N = 2e4 + 50;
const int INF  = 1e8 + 91;
int n,m;
int f[N];
struct node{
    int from;
    int to;
    int dis;
    int next;
}e[N];
int cnt;
int head[N];
double mapp[N];
void add(int u,int v,int w)
{
    cnt++;
    e[cnt].from = u;
    e[cnt].to =  v;
    e[cnt].dis = w;
    e[cnt].next = head[u];
    head[u] = cnt;
}
bool vis[N];
int num[N];
bool SPFA(double t) 
{
    queue<int> q;
    for(int i = 1; i <= n; i++) {
        vis[i] = true; mapp[i] = INF; num[i] = 0;
        q.push(i);// 关键 
    }
    while(!q.empty())
    {
        int x = q.front();
        vis[x] = false;
        q.pop();
        for(int i = head[x]; i ; i = e[i].next)
        {
            int y = e[i].to;
            double val = e[i].dis * t - f[x];// 新边权 
            if(mapp[x] + val < mapp[y]) 
            {
                mapp[y] = mapp[x] + val;// spfa 最短路 板子
                num[y] = num[x] + 1;
                if(num[y] >= n) return true;// 有 负环 
                if(vis[y] == false) q.push(y);
             }
        }
    }
    return false;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1;  i <= n; i++) scanf("%d",&f[i]);
    for(int i = 1; i <= m; i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    double l = 0, r = 1e3 + 20;
    while(l + 1e-5 < r)
    {
        double mid = (l + r) / 2;
        if(SPFA(mid) == true) l = mid;
        else r = mid;
    }
    printf("%.2f",r);
    return 0;
}

标签:分数,cnt,01,frac,int,sum,ge,include,规划
From: https://www.cnblogs.com/Elgina/p/17971060

相关文章

  • noip2015 跳石头
    原题链接根据最近的刷题经验,这种求最大最小值问题都是二分答案。首先,我们确定面对一个k,如果它符合题意,那么比他小的值也符合,如果他不符合题意,那么比他大的值更不符合;那么我们要求的就是符合找出11110000中最右边边的1。接着,我们该如何判断k是否符合题意呢?显而易见,从起点遍历所......
  • 洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
    原题链接:https://www.luogu.com.cn/problem/P1563题意解读:本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。用数组存储小人,intd[]存朝向,inta[]存名称,朝向和寻找方向有4种组合:朝向(0:向内,1:向外)  寻找方向(0:左,1:右)  数组下标操作00顺时针寻找,下标递减......
  • lufffy——01
    前情回顾#1vue3介绍-速度更快,源码的更新-全面拥抱ts:微软出的-ts是js的超集-写了ts,浏览器认识吗?---》ts最终被转成了js-重写虚拟DOM的实现和Tree-Shaking:Tree-shaking的本质是消除无用的js代码#2创建vue3项目-vue-cli......
  • [极客大挑战 2019]Knife 1
    [极客大挑战2019]Knife1审题没啥好审的,给出eval($_POST["Syc"]);一句话木马了知识点蚁剑连接一句话木马。做题蚁剑连接测试成功后打开找到flag。......
  • [AGC010E] Rearranging
    Thereare$N$integerswrittenonablackboard.The$i$-thintegeris$A_i$.TakahashiandAokiwillarrangetheseintegersinarow,asfollows:First,Takahashiwillarrangetheintegersashewishes.Then,Aokiwillrepeatedlyswaptwoadjacentintege......
  • 动态规划(2)
    目录01背包二维数组滚动数组416分割等和子集1049最后一块石头的重量494目标和01背包二维数组注意:初始化遍历顺序//二维dp数组实现#include<bits/stdc++.h>usingnamespacestd;intn,bagweight;//bagweight代表行李箱空间voidsolve(){vector<int>weight(n......
  • 运城学院数学与信息技术学院 2017—2018学年第二学期期末考试
    运城学院数学与信息技术学院2017—2018学年第二学期期末考试程序设计基础试题(A)适用范围:计算机科学与技术专业1701\1702班网络工程专业1703\1704\1705班信息管理与信息系统专业1706班数字媒体技术专业1707\1708班通信工程专业1709\17010班 命题人: 南丽丽       ......
  • 东北师范大学 计算机学院(研究生)课程表 2010学年春季学期
    东北师范大学 计算机学院(研究生)课程表2010学年春季学期班次       项目 星   节   期    次   2009年级       计算机软件与理论 专业  课            程学分教  师课程类别教室地点星期一......
  • harmonyos01
             https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/start-overview-0000001478061421-V2https://developer.huawei.com/consumer/cn/apphttps://developer.harmonyos.com/ ......
  • 【240117-1】如图,A和B为两正方形,两者共一顶角。求证:顶角两侧三角线面积相等。
    ......